Frege中的二进制操作与Haskell不同吗?

Frege中的二进制操作与Haskell不同吗?,haskell,frege,Haskell,Frege,我试图将计算“a”的Adler-32散列的Haskell代码转换为Frege,但得到的是6422626,而不是300286872 摘自Haskell代码 摘自弗雷格代码 运算符的选择是错误的还是有符号/无符号的32/64整数属性?代码没有问题。根据wikipedia(从您的链接源中找到)为该输出提供的输入应为“wikipedia”: frege> base = 65521 value base :: Int frege> :{ > adler32 xs = accuAdler

我试图将计算“a”的Adler-32散列的Haskell代码转换为Frege,但得到的是6422626,而不是300286872

摘自Haskell代码

摘自弗雷格代码


运算符的选择是错误的还是有符号/无符号的32/64整数属性?

代码没有问题。根据wikipedia(从您的链接源中找到)为该输出提供的输入应为“wikipedia”:

frege> base = 65521
value base :: Int

frege> :{
> adler32 xs = accuAdler (1,0) xs where
    accuAdler (a,b) (y:ys) =
        let newA = (a + (ord y `band` 0xff)) `mod` base
            newB = (newA + b) `mod` base
        in  accuAdler (newA, newB) ys
    accuAdler (a,b) _ = (b `bshl` 16) `bor` a
> :}
function adler32 :: Enum α => [α] -> Int

frege> adler32 "Wikipedia".toList
300286872

哦,谢谢,我完全误读了维基百科的文章。在提交消息中添加了您的答案这是一个我想从Haskell移植一段时间的包,因为不同的操作符确实不必要地混淆了。有志愿者吗?我会的,英戈。我正在努力移植java.util,但我可以坚持下去,因为在推出它之前,我还需要做一些事情。
adler32 xs = accuAdler (1,0) xs where
    accuAdler (a,b) (y:ys) =
        let newA = (a + (ord y `band` 0xff)) `mod` base
            newB = (newA + b) `mod` base
        in  accuAdler (newA, newB) ys
    accuAdler (a,b) _ = (b `bshl` 16) `bor` a
frege> base = 65521
value base :: Int

frege> :{
> adler32 xs = accuAdler (1,0) xs where
    accuAdler (a,b) (y:ys) =
        let newA = (a + (ord y `band` 0xff)) `mod` base
            newB = (newA + b) `mod` base
        in  accuAdler (newA, newB) ys
    accuAdler (a,b) _ = (b `bshl` 16) `bor` a
> :}
function adler32 :: Enum α => [α] -> Int

frege> adler32 "Wikipedia".toList
300286872