1

この関数のシグネチャを理解するために頭をかきむしっています

let make_rec f_norec =
  let rec f x = f_norec f x in
  f

どちらであるべきか

val make_rec : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>.

奇妙な再帰的な定義があることに注意してください。確かに、そこにはいくつかの知識が欠けています。関数の型を計算する方法を誰かに教えてもらえますか (型推論システムのように)。

まことにありがとうございます。

4

1 に答える 1

6

内側から始めて、外側に向かって作業します。

  1. の型を呼び出しましょうx a
  2. thenfは typeを持ちa -> bbは結果の型ですf
  3. f_norecand を取りfxと同じ型を返す必要があるfため、(a->b) -> a -> b
  4. make_recを取りf_norec、それを返しますf。したがって((a->b)->a->b) -> (a->b)。構文上の理由から、最後の括弧のペアは省略できます。
于 2013-07-03T10:29:19.417 に答える