質問

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top