小编fel*_*pez的帖子

为什么在Haskell中存在用于存在量化的"存在"关键字?

根据GHC文件,给出以下声明:

data Foo = forall a. MkFoo a (a -> Bool)
           | Nil
Run Code Online (Sandbox Code Playgroud)

然后

MkFoo :: forall a. a -> (a -> Bool) -> Foo
Run Code Online (Sandbox Code Playgroud)

(几乎)与以下伪Haskell声明同构

MkFoo :: (exists a . (a, a -> Bool)) -> Foo
Run Code Online (Sandbox Code Playgroud)

因此,不需要分离的"存在"关键字.因为:

Haskell程序员可以安全地考虑上面给出的普通的通用量化类型.

但我不确定这意味着什么.有人可以解释一下,为什么我们可以使用通用量词来表达存在量化?

haskell

18
推荐指数
1
解决办法
769
查看次数

在群集上分发Haskell

我有一段处理文件的代码,

processFiles ::  [FilePath] -> (FilePath -> IO ()) -> IO ()
Run Code Online (Sandbox Code Playgroud)

此函数生成执行IO操作的异步进程.必须通过作业调度系统(例如Slurm)将此IO操作提交给集群.

因为我必须使用作业调度系统,所以不可能使用cloudHaskell来分发闭包.相反,程序会编写一个包含所需计算的新Main.h,即与主要依赖的所有模块一起复制到集群节点,然后使用"runhaskell Main.hs [opts]"远程执行.然后,如果作业完成,异步过程应定期询问作业调度系统(使用threadDelay).

有没有办法避免创建一个新的Main?我可以序列化IO操作并在节点中以某种方式执行它吗?

distributed closures haskell

18
推荐指数
1
解决办法
369
查看次数

Repa vs Mutable矢量性能

我编写了两种算法实现来计算对称矩阵的所有特征值和特征向量.一种实现使用REPA库

https://github.com/felipeZ/Haskell-abinitio/blob/master/Science/QuantumChemistry/NumericalTools/JacobiMethod.hs

而另一个实现使用可变向量和ST monad

https://github.com/felipeZ/Haskell-abinitio/blob/master/Science/QuantumChemistry/NumericalTools/JacobiMethodST.hs

该算法是Jacobi方法,其描述可以在http://en.wikipedia.org/wiki/Jacobi_eigenvalue_algorithm中找到.

我使用100个100 x 100的矩阵测试了这两个实现,顺序运行代码,我发现了以下几次:

                  REPA      Mutable Vectors

Total time(s)    6.7            28.5

GC (s)           0.2             1.2
Run Code Online (Sandbox Code Playgroud)

雅可比算法需要迭代更新一些矩阵条目,这意味着大多数矩阵在迭代之间保持不变.因此,我会猜错(错误地)在REPA实现中为每次迭代复制新矩阵的成本将大于使用monad ST变换矩阵的成本,因为据我所知,REPA不会改变数组但是复制它.

它是REPA融合所有操作并避免在每次迭代中复制新数组?还是别的什么?

有人可以对此结果发表评论吗?

haskell repa

11
推荐指数
0
解决办法
680
查看次数

内联或不内联在Haskell中

我有几个数字运算操作占CPU时间的很大一部分.此类操作的一个示例是此功能:

import Data.Number.Erf
import Math.Gamma
import Math.GaussianQuadratureIntegration as GQI

-- Kummer's' "1F1" a.k.a M(a,b,z) Confluent Hypergeometric function
-- Approximation by the Gaussian Quadrature method from 128 up to 1024 points of resolution
kummer :: Double -> Double -> Double -> Double -> Double
kummer a b z err = gammaFactor * integralPart
    where
        gammaFactor       = (gamma b) / (gamma a * gamma (b-a))
        integralPart      = (integrator err) fun 0 1
        fun               = (\t -> (e ** (z * t)) * …
Run Code Online (Sandbox Code Playgroud)

haskell inline number-crunching

10
推荐指数
0
解决办法
599
查看次数

通用量化和统一,一个例子

给出以下运行monad的签名 ST

runST :: (forall s. ST s a) -> a
Run Code Online (Sandbox Code Playgroud)

和功能

newVar  :: a -> ST s (MutVar s a) 
readVar :: MutVar s a -> ST s a
Run Code Online (Sandbox Code Playgroud)

然后Haskell编译器将拒绝以下错误表达式

let v = runST (newVar True)
in runST (readVar v)
Run Code Online (Sandbox Code Playgroud)

因为为了评估runST,它需要的类型

readVar v :: ST s Bool 
Run Code Online (Sandbox Code Playgroud)

必须推广到

?s . ST s Bool 
Run Code Online (Sandbox Code Playgroud)

我的问题是,这里通用量词的唯一工作是确保类型变量s在评估的背景下始终是免费的,避免泛化,我是对的吗?或者这里有更多关于通用量词的内容?

haskell types

3
推荐指数
1
解决办法
217
查看次数

标签 统计

haskell ×5

closures ×1

distributed ×1

inline ×1

number-crunching ×1

repa ×1

types ×1