编辑了所有内容
我需要将单词转换为二进制数。 在你的帮助下,我得到了这个
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
答案 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
才能获得ord
和chr
个功能:
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上提供完整的代码,以便人们可以复制/粘贴您的代码,以便更轻松地帮助您,而不仅仅是您在私人副本上需要它。