誰がどこが間違っているのか教えてもらえますか?
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に、異なる数の引数に適用するため、これが発生します。