将 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
为什么1
? c2i '2' == 2
应该成立,不是吗?
您的字符串不是二进制的。基数 4 的最大允许数字是 3.
顺便说一下,foldr
、reverse
和 map
都可以合并为一个 foldl
。最好在此处更改为 foldl'
(几乎总是如此)。
我有以下函数,它接受一个以 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
为什么1
? c2i '2' == 2
应该成立,不是吗?
您的字符串不是二进制的。基数 4 的最大允许数字是 3.
顺便说一下,foldr
、reverse
和 map
都可以合并为一个 foldl
。最好在此处更改为 foldl'
(几乎总是如此)。