2

私には機能があります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 のすべての単語を作成する必要があります。これは宿題であり、タスク自体を解決するのではなく、繰り返し機能についてのみ助けてもらいたいです。

4

1 に答える 1

5

表現

iterate appendLetters [""]

タイプ[[[Char]]]iterate :: (a -> a) -> a -> [a]、およびあなたの場合はa == [[Char]])があります。したがって、の結果はgenericTake同じ型になります。しかし、wordsOfLength関数には出力タイプ[[Char]]があり、タイプの不一致が発生します。

直感的に、(可能な単語の) リストの (長さ以上の) リストを返します。ここで、単語はリスト自体であるため、[[[Char]]].

于 2013-10-27T14:49:59.370 に答える