をコンパイルするときに次のコードはコンパイルされませんなぜ私は理解していない:型エラー
append :: [a] -> [a] -> [a]
append xs ys = foldr (:) ys xs
traverse :: a -> [a] -> [[a]]
traverse x [] = [[x]]
traverse x (y:ys) = append [(x:y:ys)] (map (y:) (traverse x ys))
comb :: [a] -> [[a]]
comb [] = [[]]
comb (x:[]) = [[x]]
comb (x:y:[]) = [[x,y],[y,x]]
comb (x:xs) = map (traverse x) (comb xs)
それは次のエラーを生成します。
pr27.hs:13:20:
Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for comb :: [a] -> [[a]] at pr27.hs:10:1
Expected type: [a] -> [a]
Actual type: [a] -> [[a]]
In the return type of a call of `traverse'
In the first argument of `map', namely `(traverse x)'
Failed, modules loaded: none
しかし、ときに私はちょうどtraverse
をロードし、それを使用します上記と同様の表現で、私は望みの結果を得る。どうしたの?
Main> map (traverse 3) [[1,2],[2,1]]
[[[3,1,2],[1,3,2],[1,2,3]],[[3,2,1],[2,3,1],[2,1,3]]]
チッホンが問題を説明しているので、解決策を教えてください。私が間違っていない限り、あなたが望むのは、 'comb 'の最後の方程式を' comb(x:xs)= concatMap(traverse x)(comb xs) 'または' 'comb(x:xs)='コームxs >> =トラバースx'。 –