小编Rus*_*nor的帖子

从OCaml中的列表创建双向链表

我经常被告知使用LazyOCaml中的模块,可以用惰性语言(如Haskell)完成所有操作.为了测试这个说法,我正在尝试编写一个函数,将常规列表转换为ocaml中的静态双向链表.

type 'a dlist = Dnil | Dnode of 'a dlist * 'a * 'a dlist
Run Code Online (Sandbox Code Playgroud)

鉴于此类型,我可以手动创建几个静态双向链表:

let rec l1 = Dnode (Dnil,1,l2)
    and l2 = Dnode   (l1,2,l3)
    and l3 = Dnode   (l2,3,Dnil)
Run Code Online (Sandbox Code Playgroud)

但我想写一个类型的函数'a list -> 'a dlist,给定任何列表在OCaml中构建一个静态双向链表.例如,[1;2;3]它应该输出相当于l1上面的东西.

在Haskell中编写该算法非常简单:

data DList a = Dnil | Dnode (DList a) a (DList a)

toDList :: [a] -> DList a
toDList l = go Dnil l
 where
  go _ [] = Dnil
  go h (x:xs) …
Run Code Online (Sandbox Code Playgroud)

ocaml lazy-evaluation

15
推荐指数
2
解决办法
2686
查看次数

在Haskell中加速SHA256

我在Haskell中编写了以下用于计算sha256的代码.我发现代码很优雅,但是在GHC下,它在shaStep中花费了大量的时间,如果我正确地读取分析数据,那么大量的时间进行内存分配.鉴于应该可以在没有内存分配的情况下计算sha256,我正在寻找有关如何找出正在进行分配以及压缩它的提示.

我的代码:

{-# OPTIONS_GHC -funbox-strict-fields #-}
module SHA256 (sha256, sha256Ascii, Hash8) where

import Data.Word
import Data.Bits
import Data.List
import Control.Monad (ap)

ch x y z = (x .&. y) `xor` (complement x .&. z)
maj x y z = (x .&. y) `xor` (x .&. z) `xor` (y .&. z)

bigSigma0 x = rotateR x 2 `xor` rotateR x 13 `xor` rotateR x 22
bigSigma1 x = rotateR x 6 `xor` rotateR x 11 `xor` rotateR x 25
smallSigma0 x …
Run Code Online (Sandbox Code Playgroud)

haskell

13
推荐指数
1
解决办法
1263
查看次数

标签 统计

haskell ×1

lazy-evaluation ×1

ocaml ×1