在 Haskell 中的递归函数中进行类型转换

Type casting within a recursive function in Haskell

我正在学习 Haskell 并且 Haskell 中的递归和不同类型让我很受伤。我正在尝试创建一个递归函数,它将采用 32 位二进制数字字符串并将其转换为十进制数字。我认为我对递归如何工作的想法很好,但是将其实施到 Haskell 中让我很头疼。这是我目前所拥有的:

bin2dec :: String -> Int
bin2dec xs = ""
bin2dec (x:xs) = bin2dec xs + 2^(length xs) *  x

该函数应该取一个 32 位数字字符串,然后取下该字符串的第一个字符。例如,“0100101010100101”变为“0”和“100101010100101”。然后它应该将第一个字符变成一个整数并将它乘以字符串其余部分的 2^length,然后再次将它添加到函数调用中。因此,如果 32 位字符串中的第一个字符为“1”,则它变为 1 * 2^(31) + 递归函数调用。

但是,每当我尝试编译它时,它 returns:

traceProcP1.hs:47:14: error:
    * Couldn't match type `[Char]' with `Int'
      Expected: Int
        Actual: String
    * In the expression: ""
      In an equation for `bin2dec': bin2dec xs = ""
   |
47 | bin2dec xs = ""
   |              ^^

traceProcP1.hs:48:31: error:
    * Couldn't match expected type `Int' with actual type `Char'
    * In the second argument of `(+)', namely `2 ^ (length xs) * x'
      In the expression: bin2dec xs + 2 ^ (length xs) * x
      In an equation for `bin2dec':
          bin2dec (x : xs) = bin2dec xs + 2 ^ (length xs) * x
   |
48 | bin2dec (x:xs) = bin2dec xs + 2^(length xs) *  x
   |                               ^^^^^^^^^^^^^^^^^^

我知道这与更改数据类型有关,但我在 Haskell 中进行类型转换时遇到问题。我试过用 read 类型转换 x,我试过制作将“0”变成 0 和“1”变成 1 的守卫,但我无法让它们工作。任何帮助将不胜感激。

没有铸造。如果您想从一种类型转换为另一种类型,则需要有一个具有正确类型签名的函数来执行此操作。在 Haskell 中查找任何函数时,Hoogle 通常是一个好的开始。在这种情况下,您正在寻找 Char -> Int,它有几个有希望的选项。我看到的第一个是 digitToInt,这听起来很适合你。

但如果您更愿意自己动手​​,使用模式匹配编写具有所需行为的函数非常容易:

bit :: Char -> Int
bit '0' = 0
bit '1' = 1
bit c = error $ "Invalid digit '" ++ [c] ++ "'"