誰がどこが間違っているのか教えてもらえますか?
b f x = f x (f x)
私の理解は次f
のとおりです。左側には1つの引数がありますが、右側には2つの引数がありますか?
詳細な説明はありますか?
誰がどこが間違っているのか教えてもらえますか?
b f x = f x (f x)
私の理解は次f
のとおりです。左側には1つの引数がありますが、右側には2つの引数がありますか?
詳細な説明はありますか?
その型を構築してみましょう:
b :: ... ?
少なくとも 2 つの引数があるので、それb
に応じて変更します。
b :: a -> c -> d
の右側は、それが関数であることをb
示してf
います。まず、最初の引数のみに関係します。
f :: c -> e
これまでのところ、すべてうまく適合しています: list の最初の引数は、b の 2 番目の引数と同じ型です。右側を進みましょう。
f x (f x)
を取る場合f x _
、それが であると仮定する必要e
がありe :: k -> l
ます。つまり、別の引数を取ります。私たちは今持っています
f :: c -> k -> l
f
の 2 番目の引数の型を見てみましょう。タイプは次のいずれかである必要がありますf x
。
f x :: k -> l
だからk = k -> l
。これは無限型であり、ghci のエラー メッセージを見てもわかります。
プレリュード> let bfx = fx (fx) <インタラクティブ>:2:18: チェックが発生します:無限型を構築できません: t1 = t1 -> t0 `f' の呼び出しの戻り値の型 考えられる原因: `f' が適用される引数が少なすぎます `f' の 2 番目の引数、つまり `(fx)' 式: fx (fx)
型チェッカーは、無限型を構築できないため、あきらめます。最後f
に、異なる数の引数に適用するため、これが発生します。