Haskell迭代参数类型不匹配,为什么?

时间:2013-10-27 14:14:22

标签: loops haskell

我有一个函数appendLetters :: [[Char]] -> [[Char]]。当我尝试使用iterate这样调用此函数时:iterate appendLetters [""],ghci告诉我:

Couldn't match type '[Char]' with 'Char'  
Expected type: [Char] -> [Char]  
  Actual type: [[Char]] -> [[Char]]  
In the first argument of 'iterate', namely 'appendLetters'  
In the second argument of 'genericTake', namely  
  '(iterate appendLetters [""])'  
In the expression: genericTake n (iterate appendLetters [""]) 

Couldn't match expected type 'Char' with actual type `[Char]'  
In the expression: ""  
In the second argument of 'iterate', namely '[""]'  
In the second argument of 'genericTake', namely  
  '(iterate appendLetters [""])'  

失败,模块已加载:无。

为什么iterate期望拥有这些参数类型?我怎样才能使它发挥作用?

提前致谢。

编辑:完整代码:

wordsOfLength :: [Char] -> Integer -> [[Char]]  
wordsOfLength alphabet n = genericTake n ( iterate appendLetters [""] ) where appendLetters words = [ atFirst ++ [letter] | atFirst <- words , letter <- alphabet ]  

说明:wordsOfLength应该使用字母表并在此字母表中创建长度为n的所有单词。这是一项家庭作业,我不想获得解决任务本身的帮助,只能使用迭代函数。

1 个答案:

答案 0 :(得分:5)

表达式

iterate appendLetters [""]

的类型为[[[Char]]]iterate :: (a -> a) -> a -> [a],在您的情况下为a == [[Char]])。因此genericTake的结果将具有相同的类型。但是您的wordsOfLength函数的输出类型为[[Char]],导致类型不匹配。

直观地说,你要返回一个列表(超过长度)的列表(可能的单词),其中单词是列表本身,所以它是[[[Char]]]