如何解决在 Haskell 中将 base 4 字符串转换为 Decimal
我有以下函数,它接受一个以 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'
(几乎总是如此)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。