いくつかの講義ノートで使用されている非常に単純な例を ghci で使用しました。
foldr (:) [] 1 2
結果を期待する
[1,2]
ただし、エラーが発生します。++ または : をfoldrに指定する関数として使用しようとすると、毎回エラーが発生します。
どうやら私はかなり明らかな間違いを犯しているようですが、まだそれを見つけることができないようです。
誰でも助けることができますか?
の代わりに2 つの引数andfoldr
を渡すことで、可変引数関数のように使用しました。1
2
[1, 2]
そのようなトラブルに遭遇したときは、関数の型を確認してください。GHCiでそれを行うことができます:
Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
したがって、最初の引数は関数でなければならないことがわかります(a -> b -> b)
。そのために使用(:)
しましたが、これは問題ありません。部分的に適用された関数のタイプも確認できます。
Prelude> :t (:)
(:) :: a -> [a] -> [a]
で置き換えるb
と、次のようになり[a]
ます。
Prelude> :t foldr (:)
foldr (:) :: [a] -> [a] -> [a]
次に、[]
ベースケースとして与えました。
Prelude> :t foldr (:) []
foldr (:) [] :: [a] -> [a]
したがって、結果の関数は型[a] -> [a]
です。あなたはこれをどう考えるべきですか?リストを取得するには、リストを渡す必要があります。引数リストを渡す[1, 2]
:
Prelude> :t foldr (:) [] [1,2]
foldr (:) [] [1,2] :: Num a => [a]
型チェッカーによって受け入れられ、結果が得られます。
Prelude> foldr (:) [] [1,2]
[1,2]
これがあなたのプログラムの型デバッグに役立つことを願っています...