Haskell-fmap fmapは動作しません
質問
Haskellで少しプレイするためにGHCi(バージョン6.12.3)を使用しています。私は最近、ファンクタとapplicativeファンクタについて読んで、あなたが似たようなものができないと思ったと思いました <*>
アプリケーションファンクターのうち、ファンクタのプリミティブを使用してのみ実装されます。いくつかの考えの後、私は思い付いた fmap fmap
これは(ほぼ)理想的なタイプの
Functor f => f (a -> b) -> f (f a -> f b)
またはより一般的に
(Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b)
私は試しました
let q = fmap fmap
私は次のエラーが発生しました
<interactive>:1:8:
Ambiguous type variable `f1' in the constraint:
`Functor f1' arising from a use of `fmap' at <interactive>:1:8-16
Probable fix: add a type signature that fixes these type variable(s)
<interactive>:1:13:
Ambiguous type variable `f' in the constraint:
`Functor f' arising from a use of `fmap' at <interactive>:1:13-16
Probable fix: add a type signature that fixes these type variable(s)
提案されたように上記の型シグネチャを書くことは助けにはなりませんでした。最もクレイジーなことは、私が入力したときです :t fmap fmap
私は上記と同等のタイプを得ました。
私は何が間違っているのですか?なぜですか fmap fmap
GHCiはその型を見つけましたが、型エラーを与えますか?
解決
あなたがに実行しているように見えます 単射制限.
GHCiであなたの例を試してみてください -XNoMonomorphismRestriction
あなたの期待される結果を与えます。
また、次のように書くことでこれを覆すこともできます let f x = fmap fmap $ x
.単形性の制限は、値が「似ている」トップレベルの定義にのみ適用されます。 f = something
, したがって、明示的な引数を導入すると、それはもはや適用されなくなります。これがトップレベルになかった場合にも適用されません(例えば、 where
節)。詳細はリンクを参照してください。
他のヒント
私はまだどこにでもコメントすることはできませんので、私は答えを投稿します。先に述べたように、受信しているエラーは単形性の制限によるものです。元の質問で指定された2つのいずれかに型シグネチャを固定すると、ghciが期待していたようにghciが幸せになりますが、構文が少し間違っているの
Prelude> let q :: (Functor f) => f (a -> b) -> f (f a -> f b); q = fmap fmap Prelude> :t q q :: (Functor f) => f (a -> b) -> f (f a -> f b) Prelude> let q :: (Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b); q = fmap fmap Prelude> :t q q :: (Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b)