String 在Haskell中将基4字符串转换为十进制
我有一个函数,它取一个以4为底的字符串,并且应该返回一个十进制整数,但是我的计算似乎不正确,所以对于“22”,我需要得到10,但结果是5。请帮我解决这个问题: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
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,而不是15c2i
应该为'1'
返回1
,2
为'2'
,3
为'3'
返回0
为'0'
返回我是haskell的新手,我如何更改我的if以保持1..>3?最简单、最简单的更改是继续if,就像这样:if。。。然后。。。否则,如果。。。。然后。。。。否则如果。。。然后。。。。else…
根据需要提供更多的案例。一般来说,这不是这样写的,而是用“警卫”来写的,但让我们把它留到下次吧。最小的脚步带给你最远的距离。如果没有这样的说法,应该有。:)顺便说一句,我会使用不同的大写字母,比如base4toDec
。而且它不是十进制整数,它只是整数。:)当然,在将base-4字符串转换为整数后,使用show
(或print
)很容易获得其base-10表示形式。