小编rit*_*mon的帖子

什么是逆变函子?

这种类型让我大吃一惊:

class Contravariant (f :: * -> *) where
  contramap :: (a -> b) -> f b -> f a
Run Code Online (Sandbox Code Playgroud)

然后我读了这个,但与标题相反,我不再开悟了.

有人可以解释逆变函子是什么以及一些例子吗?

haskell functor

34
推荐指数
4
解决办法
5460
查看次数

为什么这个Haskell代码比C等效代码慢得多?未装箱的载体和刘海已经使用过

我在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源代码在这里:

performance haskell

14
推荐指数
1
解决办法
264
查看次数

如何在Haskell中触发类型族模式匹配错误?

Haskell是否能够指示类型系列匹配错误?例如,使用封闭类型系列:

type family Testf a where
  Testf Char   = IO ()
  Testf String = IO ()
Run Code Online (Sandbox Code Playgroud)

这种类型Testf Int就是Testf Int.编译器不会生成任何类型的错误.如果没有匹配,是否可以让它生成一个?

haskell type-level-computation

8
推荐指数
1
解决办法
233
查看次数

在这篇Kmett CRC文章中,为什么ab = a0 ^ n + 0 ^ mb?这种符号是什么意思?

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^n0^m b?这些权力是这样的a * pow(0, n)吗?如果是这样,不会0 ^ n = 0?或者XOR?还有别的吗?这个空间有意义吗?我不明白为什么,例如:

ab = a0^n + 0^m b
Run Code Online (Sandbox Code Playgroud)

为什么0^m …

math haskell crc

8
推荐指数
1
解决办法
123
查看次数

在使用repa时使用Identity monad与mmultP有什么问题?

我不明白为什么这个程序使用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)

parallel-processing haskell repa

6
推荐指数
1
解决办法
128
查看次数

如何使Stack只构建一个可执行文件?堆栈构建:exe1不起作用?

我的一个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.

可能是什么导致了这个?

haskell haskell-stack

6
推荐指数
1
解决办法
257
查看次数

Mac和Linux上C++ 11异步行为的差异

考虑以下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)

Mac结果

使用命令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)

这是预料之中的.花最少的时间去AB,等待1秒钟,然后得到了 …

c++ linux macos asynchronous c++11

6
推荐指数
1
解决办法
447
查看次数

Haskell 可变向量没有映射、折叠等......更高级别的函数?

在使用首次可变矢量,我发现,虽然Data.Vector.Unboxed拥有所有你喜欢预期更高层次的功能mapfold等等,可变的版本Data.Vector.Unboxed.Mutable没有这些。尝试在可变向量上使用 immutable 包中的函数不起作用。

mutable vector 包缺少很多这些高级函数的原因是什么?

haskell vector mutable

5
推荐指数
1
解决办法
317
查看次数

没有固定背景高度的纯CSS视差?

我试图在没有固定背景高度的情况下获得纯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)

css css3 parallax css-transforms

5
推荐指数
1
解决办法
1913
查看次数

可以使用未装箱的向量进行递归定义吗?

我想以递归方式生成一个未装箱的矢量.举个简单的例子:

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,代码将挂起.我理解为什么会这样,但我仍然希望能够做一个递归定义并获得一个未装箱的矢量的速度.这样做有可能吗?

recursion haskell vector

4
推荐指数
2
解决办法
164
查看次数