【发布时间】:2019-06-19 19:55:30
【问题描述】:
我目前正在做一项家庭作业,该作业要求我实现一个无需使用列表推导或递归即可将二进制转换为十进制的函数。
我尝试过使用折叠,明确地使用foldr,来实现这一点,但不能完全得到正确的结果。在related thread 我发现了以下内容
bintodec :: [Bool] -> Int
bintodec = foldr (\x y -> fromEnum x + 2*y) 0
这似乎是一个很好的起点,但对我来说似乎没有产生正确的结果。它似乎适用于任何给定的奇数,其中列表仅包含Trues,但不适用于其他任何东西。
分配的函数也应该有这个签名:
binarytoInteger :: [Bool] -> Integer
我试图通过在各个点使用toInteger 函数来使用上述定义来实现,但实际上永远无法匹配函数定义的类型。
我很乐意为您提供正确方向的提示!
【问题讨论】:
-
在您的
bintodec中,它适用于第一个Bool最低有效位 (LSB)。 -
foldr (\x y -> (if x then 1 else 0) + 2*y) 0 . reverse. -
foldr是递归的。您的意思是不允许使用显式递归吗? -
是的,我知道,应该澄清一下。没有显式递归
标签: haskell