1

誰がどこが間違っているのか教えてもらえますか?

b f x = f x (f x)

私の理解は次fのとおりです。左側には1つの引数がありますが、右側には2つの引数がありますか?

詳細な説明はありますか?

4

2 に答える 2

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に、異なる数の引数に適用するため、これが発生します。

于 2014-05-21T23:55:44.947 に答える