我试图使用Haskell Iteratee库提出相当于"wc -l"的东西.下面是"wc"的代码(它只计算单词 - 类似于hackage上的iteratee示例中的代码),并且运行速度非常快:
{-# LANGUAGE BangPatterns #-}
import Data.Iteratee as I
import Data.ListLike as LL
import Data.Iteratee.IO
import Data.ByteString
length1 :: (Monad m, Num a, LL.ListLike s el) => Iteratee s m a
length1 = liftI (step 0)
where
step !i (Chunk xs) = liftI (step $ i + fromIntegral (LL.length xs))
step !i stream = idone i stream
{-# INLINE length1 #-}
main = do
i' <- enumFile 1024 "/usr/share/dict/words" (length1 :: (Monad m) => Iteratee ByteString …Run Code Online (Sandbox Code Playgroud) 最近,我读了纸张在即将到来的广义流的融合vector和DPH图书馆.这似乎是非常有趣的发展.我现在开始尝试DPH(从GHC 7.6开始,并计划在它出来时升级到7.8 SIMD版本).我还从Repa库文档中看到它可以执行并行数组工作.Repa似乎是成熟的版本,相比之下DPH,GHC 7.4没有被认为是准备好的.现在,DPH似乎是成熟的,我想知道什么是之间的主要优点和缺点Repa和DPH封装,GHC 7.6.我搜索了StackOverflow和谷歌,但找不到Repa和之间的比较DPH.因此,这个问题.
我编写了一个函数将64位Double转换为ByteString(架构/类型安全性并不是真正的问题 - 我们现在假设Double是64位Word).虽然下面的函数运行良好,但我想知道是否有更快的方法将Double转换为ByteString.在下面的代码中,有一个解压缩Word64到Word8列表,然后反向(使它成为小端格式),然后打包到ByteString.代码如下:
{-# LANGUAGE MagicHash #-}
import GHC.Prim
import GHC.Types
import GHC.Word
import Data.Bits (shiftR)
import Data.ByteString (pack, unpack)
import Data.ByteString.Internal (ByteString)
import Text.Printf (printf)
encodeDouble :: Double -> ByteString
encodeDouble (D# x) = pack $ reverse $ unpack64 $ W64# (unsafeCoerce# x)
unpack64 :: Word64 -> [Word8]
unpack64 x = map (fromIntegral.(shiftR x)) [56,48..0]
-- function to convert list of bytestring into hex digits - for debugging
bprint :: ByteString -> String
bprint x = ("0x" ++ ) …Run Code Online (Sandbox Code Playgroud) 在对Criterion中的函数进行基准测试之前,如何强制评估函数的输入?我试图对一些函数进行基准测试,但是想要排除评估输入thunk的时间.有问题的代码使用未装箱的向量进行输入,对于Int向量不能深入研究.下面的示例代码段:
-- V is Data.Vector.Unboxed
shortv = V.fromList [1..10] :: V.Vector GHC.Int.Int16
intv = V.fromList [1..10] :: V.Vector GHC.Int.Int32
main :: IO ()
main = defaultMain [
bench "encode ShortV" $ whnf encodeInt16V shortv
,bench "encode IntV" $ whnf encodeInt32V intv
]
Run Code Online (Sandbox Code Playgroud)
标准基准包括构建shortv的时间,以及在对上述函数进行基准测试时的intv输入.标准测量值如下 - 每个函数测量约400ns,似乎也包括输入的构建时间:
benchmarking encode ShortV
mean: 379.6917 ns, lb 378.0229 ns, ub 382.4529 ns, ci 0.950
std dev: 10.79084 ns, lb 7.360444 ns, ub 15.89614 ns, ci …Run Code Online (Sandbox Code Playgroud) 我想Redhat x86_64 (RHEL v5)在工作的服务器上安装GHC 7.2.2 (在我的用户帐户中.我没有root访问权限).我Linux x86_64从GHC下载页面下载了通用二进制文件.但是,当我运行时configure,它会抛出glibc版本异常,ghc-pwd因为glibcLinux上的版本是2.6.所需的glibc版本是2.7.
我google了但没有找到任何预先配置的Redhat 5的GHC二进制文件.如果任何人已经想到它RHEL 5(或任何Linux风味,如果解决方法是一般的),我将非常感谢如何解决glibc版本问题的指针.或者,如果Redhat x86_64某处有可用的压缩二进制文件,我可以下载并解压缩它们,如果你指向我的话.否则看起来我在工作中遇到了GHC 6.12.
gcc(我尝试4.7.2使用带有-O3标志的Mac和Linux )将ackermann函数优化为使用大型本地堆栈的单个调用.以下Ackermann代码示例:
int ack(int m,int n){
if(m == 0) return n+1;
if(n == 0) return ack(m-1,1);
return ack(m-1,ack(m,n-1));
}
Run Code Online (Sandbox Code Playgroud)
当反汇编时,只有一个递归调用ack函数,而不是两个调用(我无法解析正在发生的事情 - ack现在由gcc转换为具有8个参数的函数,以及49 int和9 char的本地堆栈).我试着查看gcc通过什么样的转换来优化Ackermann函数到单个调用,但没有找到任何感兴趣的东西.我将理解指向gcc执行哪些主要转换以将深度递归的Ackermann转换为单个递归调用.LLVM gcc(我在Mac上尝试过v4.2)并没有将它减少到单个递归调用,并且使用-O3flag会慢4倍.这种优化似乎非常有趣.
通过阅读github上的parfib.hs代码时,我看到了关于monadic版本的内存分配的评论:
Monad-par version:
fib(38) non-threaded: 23.3s 23.1s
fib(38) 1 thread : 24.7s 24.5s
fib(38) 4 threads: 8.2s 31.3s
fib(40) 4 threads: 20.6s 78.6s **240GB allocated**
Run Code Online (Sandbox Code Playgroud)
是否有任何纸质或博客文章解释了这个巨大的内存占用?非monadic版本的内存分配在代码注释中记录为17GB(对于fib(42)).我搜索了Simon Marlow的par monad论文和演示,但我还没有看到对parfib的记忆足迹的任何分析.
我正在通过功能性珍珠纸Monadic parsing in Haskell(在推荐haskellforall.com阅读该论文以了解解析之后).我写了一个实现,直到第3页第4节,如下所示:
newtype Parser a = Parser (String -> [(a,String)])
parse (Parser p) = p
instance Monad Parser where
return a = Parser (\cs -> [(a,cs)])
p >>= f = Parser (\cs -> concat [parse (f a) cs' | (a,cs') <- parse p cs])
item :: Parser Char
item = Parser (\cs -> case cs of
"" -> []
(c:cs) -> [(c,cs)])
p :: Parser (Char,Char)
p = do { a <- item; item; …Run Code Online (Sandbox Code Playgroud) 我正在挖掘ghcjs-jquery代码以了解其JavascriptFFI工作原理。我想弄清楚的是,一旦您为 JS 函数定义了 FFI 导入类型签名,您如何帮助ghcjs定位包含该函数的文件。
检查Internal.hs和 Cabal 配置,我没有看到任何指定 JQuery JS 文件路径的方法。我还四处寻找有关JavascriptFFI功能的文档,但没有找到任何内容。我将感谢有关如何ghcjs为任何 JS 库执行 Javascript FFI 的指示。必须有一些命令行选项ghcjs来告诉它在哪里找到js文件。
我打算玩道场库函数后,我想出JavascriptFFI的功能ghcjs。
为什么seq在下面的代码中有两个调用(来自此处) -r传递了两次:
first' :: (a -> b) -> (a, c) -> (b, c)
first' f (x,y) = let { x' = f x; r = (x', y) }
in x' `seq` r `seq` r
Run Code Online (Sandbox Code Playgroud)
我认为一个调用可以seq使它变得严格。