哈斯克尔。单词成二进制数

时间:2011-01-13 17:37:08

标签: haskell

编辑了所有内容

我需要将单词转换为二进制数。 在你的帮助下,我得到了这个

 import Data.Char


blCo :: String -> String
blCo xs = concatMap  lett2num) xs            

lett2num :: Char ->  Int
lett2num y 
   | (ord 'A' <= ord y) ord 'z') =  (ord y - ord 'a') +1


num2bin :: Int -> String
num2bin n
  | n >= 0     =  ctive number"
  where n2b 0  =  []
        n2b n  =  n `mod` 2 : n2b (n `div` 2)

GHC告诉我一个错误。我不会忘记它 错误:

Couldn't match expected type `Char' against inferred type `String'
In the first argument of `(:)', namely `num2bin (lett2num x)'
In the expression: num2bin (lett2num x) : blCo xs
In the definition of `blCo':
    blCo (x : xs) = num2bin (lett2num x) : blCo xs

2 个答案:

答案 0 :(得分:1)

这里有很多类型错误,只是粗略一瞥。

您已将blCo声明为String -> Integer。所以它需要一个字符串,并返回一个整数。但String参数x被传递到lett2num,它应该带一个字符 - 这不会起作用,这就是错误信息的含义。也许您打算将该行声明为

blCo [x]  = num2bin(lett2num x)

以便x匹配单字符字符串中的字符值? 在任何情况下,这都是导致编译器错误的原因 - 您将String传递给期望char的函数。

此外,blCo应该返回Integer,但其返回值总体上将是num2bin的输出(某些参数) - 并且此函数返回String,因此这也无法工作。如果没有看到lett2bin做了什么(和/或你的方法是什么),我就不能说出了什么是错的 - 但似乎某些东西在某处并没有加起来。

那是什么 - 你试图输出一个String(传入的数字字符串的二进制表示)?或者您是否尝试输出某种整数?

答案 1 :(得分:0)

1)请写清楚的问题,包括编译器错误(如果有的话)。

2)请尽可能包含所有代码。这段代码缺少lett2num。

3)一些问题:

您需要导入Data.Char才能获得ordchr个功能:

import Data.Char

你对blCo的警惕是荒谬的,将其删除。此外,第二个定义永远不会运行,因为第一个定义始终匹配,即blCo x x始终匹配输入。所以你需要重写blCo。

编辑: 这里还是有点不对劲。我建议你继续使用IRC并实时讨论它,这样除了正确的代码之外你还可以获得更多的理解。

1)初学者的输入:你调用一个应该返回num2bin的函数(String)并使用:在列表中连接它,这将导致{{ 1}})但希望最终只有:: [String]。我猜你想用String

2)blCo xs = concatMap (num2bin . lett2num) xs在列表中是递归的,但是没有定义当列表命中blCo时要做什么。一种选择是重新定义它以使用[],使其成为非递归的。

3)您错过了导入concatMap的部分内容。重点是在SO上提供完整的代码,以便人们可以复制/粘贴您的代码,以便更轻松地帮助您,而不仅仅是您在私人副本上需要它。