0

関数について常に読んでいます:

fun constantly k a = k

しかし、私はそれを扱う方法を理解していません。私はそのように試しました:

val a = constantly 10;
stdIn:32.5-32.28 Warning: type vars not generalized because of
  value restriction are instantiated to dummy types (X1,X2,...)
  val a = fn : ?.X1 -> int * int -> int

それはそのように動作します:

val a = constantly 10 ();
  val a : int = 10

しかし、そうではありません:

val a = constantly 10;
a ();
stdIn:36.1-36.5 Error: operator and operand don't agree [tycon mismatch]
operator domain: ?.X1
operand:         unit
in expression:
  a ()

その機能を理解するのを手伝ってくれる人はいますか?

4

2 に答える 2

1

これが値の制限です。ML での部分適用を理解することは重要です。多型が存在する場合の可変性のために必要です。

http://mlton.org/ValueRestriction http://users.cis.fiu.edu/~smithg/cop4555/valrestr.html

このような警告が表示された場合はいつでも、式を eta 展開することで修正できます。

fun a x = constantly 10 x;
于 2013-10-21T14:20:38.310 に答える