8

Ocamlでは、異なるアリティを持つタプルは異なる型と値のコンストラクタを持っています:

# let a = (1, 2, 3);;
val a : int * int * int = (1, 2, 3)
# let b = (1, (2, 3));;
val b : int * (int * int) = (1, (2, 3))

2番目の例(b)は、最初の(a)よりも柔軟性があることに注意してください。これは、bの「テール」-(2、3)-自体が有効な値であるためです。

# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)

「(1、2、3)」を「(1、(2、3))」として解析せず、代わりに、さまざまなアリティに対して無限(またはさらに悪いことに有限)の新しい型および値コンストラクターを導入する理由は何ですか? ?

4

1 に答える 1

8

"(1, 2, 3)" を "(1, (2, 3))" として解析せず、代わりに無限の (さらに悪いことに、有限の) 量の新しい型と値のコンストラクターをさまざまなアリティに導入する理由は何ですか? ?

ML 型システムは、コンパイル時にできるだけ多くのエラーを検出するために、より強力な静的型チェックを追求して設計されました。

(1, 2, 3)あなたの提案は、とを区別できなくなるため、型システムを大幅に弱体化させます(1, (2, 3))。これは反対方向への動きです。

実際には、このような区別を行う ML は、過去に実稼働コードで実際のエラーを検出したと言えます。私はこの文脈で ML 設計を高く評価しています。

于 2013-01-31T19:40:04.233 に答える