我有一个函数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的所有单词。这是一项家庭作业,我不想获得解决任务本身的帮助,只能使用迭代函数。
答案 0 :(得分:5)
表达式
iterate appendLetters [""]
的类型为[[[Char]]]
(iterate :: (a -> a) -> a -> [a]
,在您的情况下为a == [[Char]]
)。因此genericTake
的结果将具有相同的类型。但是您的wordsOfLength
函数的输出类型为[[Char]]
,导致类型不匹配。
直观地说,你要返回一个列表(超过长度)的列表(可能的单词),其中单词是列表本身,所以它是[[[Char]]]
。