String 在Haskell中将基4字符串转换为十进制

String 在Haskell中将基4字符串转换为十进制,string,haskell,integer,decimal,data-conversion,String,Haskell,Integer,Decimal,Data Conversion,我有一个函数,它取一个以4为底的字符串,并且应该返回一个十进制整数,但是我的计算似乎不正确,所以对于“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 注意:我不允许使用导入 示例:base4T

我有一个函数,它取一个以4为底的字符串,并且应该返回一个十进制整数,但是我的计算似乎不正确,所以对于“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
为什么
1
<代码>c2i'2'==2应该可以,不是吗

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


顺便说一下,
foldr
reverse
map
都可以融合成一个
foldl
。这里最好改为
foldl'
(几乎总是这样)。

没有理由使用foldr、reverse和map,我如何融合它们?同样,即使在从1变为2之后,“33”也会从1变为2,而不是15
c2i
应该为
'1'
返回
1
2
'2'
3
'3'
返回
0
'0'
返回
我是haskell的新手,我如何更改我的if以保持1..>3?最简单、最简单的更改是继续if,就像这样:
if。。。然后。。。否则,如果。。。。然后。。。。否则如果。。。然后。。。。else…
根据需要提供更多的案例。一般来说,这不是这样写的,而是用“警卫”来写的,但让我们把它留到下次吧。最小的脚步带给你最远的距离。如果没有这样的说法,应该有。:)顺便说一句,我会使用不同的大写字母,比如
base4toDec
。而且它不是十进制整数,它只是整数。:)当然,在将base-4字符串转换为整数后,使用
show
(或
print
)很容易获得其base-10表示形式。