将 base 4 字符串转换为 Haskell 中的 Decimal

convert base 4 string to Decimal in Haskell

我有以下函数,它接受一个以 4 为底的字符串,并且应该 return 一个十进制整数,但我的计算似乎不正确,所以对于“22”我需要得到 10 但是它显示为 5。请帮我解决这个问题:

   base4Todec :: String -> Int
   base4Todec = foldr (\c s -> s * 4 + c) 0 . reverse . map c2i
       where c2i c = if c == '0' then 0 else 1

注意:我不允许使用导入

示例:base4Todec "22" = 10

只有在比常规方式更清晰的情况下,无点编写函数才是好的。这里看起来不是那样的。那么,

base4Todec :: String -> Int
base4Todec cs  =  foldr (\c s -> s * 4 + c) 0 $ reverse $ map c2i cs
    where 
    c2i c  =  if c == '0' then 0 else 1

变化不大,但现在原因很清楚了:

    where 
    c2i c  =  if c == '0' then 0 else 1

为什么1c2i '2' == 2 应该成立,不是吗?

您的字符串不是二进制的。基数 4 的最大允许数字是 3.

顺便说一下,foldrreversemap 都可以合并为一个 foldl。最好在此处更改为 foldl'(几乎总是如此)。