小编Sal*_*Sal的帖子

使用Iteratee库编写"wc -l" - 如何过滤换行符?

我试图使用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)

haskell filter iterate

7
推荐指数
1
解决办法
446
查看次数

维修和DPH之间的区别

最近,我读了纸张在即将到来的广义流的融合vectorDPH图书馆.这似乎是非常有趣的发展.我现在开始尝试DPH(从GHC 7.6开始,并计划在它出来时升级到7.8 SIMD版本).我还从Repa库文档中看到它可以执行并行数组工作.Repa似乎是成熟的版本,相比之下DPH,GHC 7.4没有被认为是准备好的.现在,DPH似乎是成熟的,我想知道什么是之间的主要优点和缺点RepaDPH封装,GHC 7.6.我搜索了StackOverflow和谷歌,但找不到Repa和之间的比较DPH.因此,这个问题.

haskell repa data-parallel-haskell

7
推荐指数
1
解决办法
578
查看次数

有效地将64位Double转换为ByteString

我编写了一个函数将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)

haskell casting bytestring

6
推荐指数
2
解决办法
1223
查看次数

在Criterion中进行基准测试之前强制评估函数输入

在对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)

haskell lazy-evaluation haskell-criterion

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

使用libc版本<2.7在Linux上编译GHC 7.2+

我想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.

haskell ghc

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

ackermann的gcc转换传递

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倍.这种优化似乎非常有趣.

optimization gcc

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

monad-par例子中parfib的空间分析

通过阅读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的记忆足迹的任何分析.

parallel-processing haskell

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

Monadic解析功能珍珠 - 将多个解析器粘合在一起

我正在通过功能性珍珠纸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)

parsing haskell

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

为 FFI 定位 Javascript 库

我正在挖掘ghcjs-jquery代码以了解其JavascriptFFI工作原理。我想弄清楚的是,一旦您为 JS 函数定义了 FFI 导入类型签名,您如何帮助ghcjs定位包含该函数的文件。

检查Internal.hs和 Cabal 配置,我没有看到任何指定 JQuery JS 文件路径的方法。我还四处寻找有关JavascriptFFI功能的文档,但没有找到任何内容。我将感谢有关如何ghcjs为任何 JS 库执行 Javascript FFI 的指示。必须有一些命令行选项ghcjs来告诉它在哪里找到js文件。

我打算玩道场库函数后,我想出JavascriptFFI的功能ghcjs

haskell ffi ghcjs

5
推荐指数
0
解决办法
179
查看次数

在“first”的严格版本中两次调用“seq”

为什么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使它变得严格。

haskell seq

5
推荐指数
2
解决办法
74
查看次数