这种类型让我大吃一惊:
class Contravariant (f :: * -> *) where
contramap :: (a -> b) -> f b -> f a
Run Code Online (Sandbox Code Playgroud)
然后我读了这个,但与标题相反,我不再开悟了.
有人可以解释逆变函子是什么以及一些例子吗?
我在Haskell和C中编写了一个简短的Mandelbrot Set生成器,发现C版本的运行速度比Haskell版本快20倍.虽然我预计Haskell会变慢,但考虑到我已经在使用未装箱的矢量和刘海来避免过度的篡改,我没想到会超过一个数量级.
分析显示大部分时间都花费在go
以下代码的功能上,这实际上只是一个带有一些比较,乘法和加法的循环.
orbits limit radius a b = go 0 0 0
where
r2 = radius * radius
go !n !x !y
| n == limit = n
| x2 + y2 >= r2 = n
| otherwise = go (n + 1) (x2 - y2 + a) (2 * x * y + b)
where
x2 = x * x
y2 = y * y
Run Code Online (Sandbox Code Playgroud)
在执行过程中,它需要运行C代码0.9秒,并且等效的Haskell代码需要18秒.它们都实现相同的算法,并且它们都生成相同的输出(PGM图形文件).
Haskell源代码在这里:
Haskell是否能够指示类型系列匹配错误?例如,使用封闭类型系列:
type family Testf a where
Testf Char = IO ()
Testf String = IO ()
Run Code Online (Sandbox Code Playgroud)
这种类型Testf Int
就是Testf Int
.编译器不会生成任何类型的错误.如果没有匹配,是否可以让它生成一个?
在Edward Kmett关于CRC的文章中,它有以下推导:
CRC(ab) = -- definition of CRC
crc(INIT,ab) + FINAL = -- linearity
crc(INIT,a0^n + 0^m b) + FINAL = -- additive homomorphism
crc(INIT,a0^n) + crc(0,0^nb) + FINAL = -- zero blindness
crc(INIT,a0^n) + crc(0,b) + FINAL -- definition of crc
crc(crc(INIT,a),0^n) + crc(0,b) + FINAL -- additive homomorphism
crc(crc(INIT,0^m)+crc(0,a),0^n) + crc(0,b) + FINAL
Run Code Online (Sandbox Code Playgroud)
世界上有什么a0^n
和0^m b
?这些权力是这样的a * pow(0, n)
吗?如果是这样,不会0 ^ n = 0?或者XOR?还有别的吗?这个空间有意义吗?我不明白为什么,例如:
ab = a0^n + 0^m b
Run Code Online (Sandbox Code Playgroud)
为什么0^m …
我不明白为什么这个程序使用repa:
import Data.Array.Repa
import Data.Array.Repa.Algorithms.Matrix
import Data.Functor.Identity
go = runIdentity $ do
let mat = fromListUnboxed (ix2 2 2) [1..4]
let ins = fromListUnboxed (ix2 2 1) [1, 1]
mmultP mat ins
Run Code Online (Sandbox Code Playgroud)
给我以下警告:
Data.Array.Repa: Performing nested parallel computation sequentially.
You've probably called the 'compute' or 'copy' function while another
instance was already running. This can happen if the second version
was suspended due to lazy evaluation. Use 'deepSeqArray' to ensure
that each array is fully evaluated before you …
Run Code Online (Sandbox Code Playgroud) 我的一个Stack项目中有多个可执行文件:
executable m1
hs-source-dirs: src
main-is: Main1.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5
executable m2
hs-source-dirs: src
main-is: Main2.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5
Run Code Online (Sandbox Code Playgroud)
stack build :m2
Run Code Online (Sandbox Code Playgroud)
但实际发生的是,无论是否包含包名,包类型等,都可以构建可执行文件m1和m2.
可能是什么导致了这个?
考虑以下C + 11代码:
#include <chrono>
#include <future>
#include <iostream>
#include <thread>
using namespace std;
int main() {
auto start = chrono::steady_clock::now();
auto elapsed = [start](string s) {
cout << s << (chrono::steady_clock::now() - start).count() << endl;
};
elapsed("A ");
auto fut (async([]() { this_thread::sleep_for(chrono::seconds(2)); }));
elapsed("B ");
this_thread::sleep_for(chrono::seconds(1));
elapsed("C ");
fut.wait();
elapsed("D ");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用命令c++ -std=c++11 -stdlib=libc++ -Wall question.cc -o question
和运行在macOS Sierra上编译所述代码,我得到输出:
A 27186
B 86970
C 1001961755
D 2001585903
Run Code Online (Sandbox Code Playgroud)
这是预料之中的.花最少的时间去A
和B
,等待1秒钟,然后得到了 …
在使用首次可变矢量,我发现,虽然Data.Vector.Unboxed
拥有所有你喜欢预期更高层次的功能map
,fold
等等,可变的版本Data.Vector.Unboxed.Mutable
没有这些。尝试在可变向量上使用 immutable 包中的函数不起作用。
mutable vector 包缺少很多这些高级函数的原因是什么?
我试图在没有固定背景高度的情况下获得纯CSS视差效果.这已在一些 地方进行了描述,但它们有一个共同的约束条件,即背景层必须具有固定的已知高度.
由于某些动态内容,我希望在没有固定的,已知的背景高度的情况下使效果正常工作.
我的最小例子是:https://jsfiddle.net/yf8oyben/
#container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
perspective: 1px;
overflow-x: hidden;
overflow-y: scroll;
}
.background {
transform: translateZ(-1px) scale(2);
width: 100%;
background: lightgreen;
height: 250px; /* Assumes bg height */
position: absolute; /* Assumes bg height */
top: calc(125px - 50vh); /* Assumes bg height */
}
.foreground {
background: rgba(0, 0, 255, 0.5);
width: 100%;
position: absolute; /* Assumes bg height */
top: 250px; /* …
Run Code Online (Sandbox Code Playgroud)我想以递归方式生成一个未装箱的矢量.举个简单的例子:
import qualified Data.Vector as V
fib :: V.Vector Int
fib = V.generate 10 f
where
f 0 = 0
f 1 = 1
f x = (fib V.! (x - 1)) + (fib V.! (x - 2))
Run Code Online (Sandbox Code Playgroud)
该函数正确地生成斐波那契序列.但是,如果我使用Data.Vector.Unboxed
,代码将挂起.我理解为什么会这样,但我仍然希望能够做一个递归定义并获得一个未装箱的矢量的速度.这样做有可能吗?