Haskell中的二进制到十进制,无需使用递归或列表推导

时间:2019-06-19 08:25:35

标签: haskell

我目前正在从事一项家庭作业,要求我实现一个无需使用列表推导或递归即可将二进制转换为十进制的函数。

我尝试使用折叠(显式使用segue来实现此功能,但无法完全获得正确的结果。在related thread中,我发现了以下

foldr

这似乎是一个很好的起点,但似乎并没有为我带来正确的结果。它似乎适用于任何给定的奇数,其中列表仅包含bintodec :: [Bool] -> Int bintodec = foldr (\x y -> fromEnum x + 2*y) 0 ,而不适用于其他任何事物。

分配的功能也应该具有以下签名:

True

我试图通过在各个点使用binarytoInteger :: [Bool] -> Integer 函数来使用上述定义来实现,但实际上并不能匹配函数定义的类型。

我很高兴看到正确方向的提示!

1 个答案:

答案 0 :(得分:4)

  

这似乎是一个很好的起点,但似乎并没有为我带来正确的结果。它似乎适用于任何给定的不均匀数字,该列表仅包含True,而不适用于其他任何东西。

在确实将二进制列表转换为整数的意义上,它起作用。但是在您的函数中, first 元素是最低有效位(LSB)

例如,我们可以在此处使用fold

import Data.Bool(bool)

bin2dec :: (Foldable f, Integral i) => f Bool -> i
bin2dec = foldl (\a -> (+) (2*a) . bool 0 1) 0

例如:

Prelude Data.Bool> bin2dec [False]
0
Prelude Data.Bool> bin2dec [True]
1
Prelude Data.Bool> bin2dec [True, False]
2
Prelude Data.Bool> bin2dec [True, True]
3
Prelude Data.Bool> bin2dec [True, False, False]
4
Prelude Data.Bool> bin2dec [True, False, True]
5
Prelude Data.Bool> bin2dec [True, True, False]
6
Prelude Data.Bool> bin2dec [True, True, True]
7