2

だから私は y-combinator と匿名関数をいじっていて、この奇妙なエラーに遭遇しました:

Couldn't match expected type `t0 -> t1 -> t2'
            with actual type `forall b. b -> [b] -> [b]'
The lambda expression `\ (n :: Int) newVal xs -> ...'
has three arguments,
but its type `Int -> forall b. b -> [b] -> [b]' has only one

エラーを作成するソースコードと、最終的に動作するようになったバージョン

ランク N ポリモーフィズム (use )を避けるために型を少し変更するforall b. Int -> b -> [b] -> [b]と、エラーは次のようになります。

Couldn't match expected type `t0 -> t1 -> t2 -> t3'
            with actual type `forall b. Int -> b -> [b] -> [b]'
The lambda expression `\ (n :: Int) newVal xs -> ...'
has three arguments,
but its type `forall b. Int -> b -> [b] -> [b]' has none

forall b. b -> [b] -> [b]なぜ議論がないのか誰かが私に説明でき ますか?

4

3 に答える 3

2

GHC 7を使用しているので、これはhttp://hackage.haskell.org/trac/ghc/ticket/4347で報告されているバグと同じ根本的な原因があるようです。そのバグレポートは非​​叙述的なポリモーフィズムについて語っていますが、それは上位のポリモーフィズムの統一問題にある可能性が最も高いようです。あなたの場合、それはあなたの配置によって引き起こされておりforall、それはタイプを構文的にランク2にします。

これは実際にはバグではないことに注意してください。提供されたさらなる明確化は、これが意図された振る舞いであることを明らかにし、ランクN型および非叙述型を含む型の多形的インスタンス化は推測されません。型署名を注意深く追加すると、機能するようになります。

しかし、タイプは上位を意図したものではなかったので、あなたの場合は、それを取り除くのが最善です。

于 2011-05-04T18:17:37.210 に答える
0

私の推測では、あなたは間違ったタイプを書き留めたのです。

型の注釈を削除すると、混乱を招くエラーが少なくなり、多少は役に立ちます。

A.hs:7:76:
    Occurs check: cannot construct the infinite type: a0 = [a0]
    In the third argument of `replaceNth', namely `arg'
    In the expression: replaceNth m (replaceNth n v (arg !! m)) arg

それで

 \m n v arg -> replaceNth m (replaceNth n v (arg !! m)) arg

すでに問題を抱えています。


ランク N の型とレキシカル スコープの型変数

forall最も外側の位置にないを使用することで、ランクNの型に出くわしました。あなたのforall内側のbは、それが不透明で多形的であり、その型の他の用途とは無関係でなければならないと言っていますb。これは意図したものではない可能性があります。

これは、レキシカル スコープの型変数とは微妙に異なります。型変数は、こちらで説明されているように、最も外側の位置でforall によって導入することもできます。

forall最も外側ではない位置にある (私が思うに) 誤った s を削除することで、より単純な型エラーが発生します。

于 2011-05-04T15:49:45.320 に答える
0

むしろ欲しいですか

forall b. Int -> b -> [b] -> [b]

または本当に

Int -> forall b . b -> [b] -> [b]

私は後者を読みます: Int を取り、SOMETHING OPAQUE THAT IS MOST LIKELY NOT WHAT YOU THINK IT ISを返す関数。

于 2011-05-04T15:46:18.063 に答える