88190


「プログラミングin OCaml」 を見ています、  
他のプロジェクトも見ていて`..`の使い方に疑問を持って質問させていただきました。

この本では`..`の使い道はオブジェクト定義の拡張でした（列の多相性）、例（251ページ）：

[code]

    # let test_calc c = c#input 10; c#plus; c#input 20; c#eq = 30;;
    val test_calc : < eq : int; input : int -> ’a; plus : ’b; .. > -> bool = <fun>
    
[/code]

しかし、あるプロジェクトのコードを見たらこのようなコードがありました：

[code]

    type 'x ccc = .. ;;
    
[/code]

少し関連はあると思いますが、実際これはどういうことか分からなくて悩んでいます、教えて頂くと助かります、宜しくおねがいします。

> 試したこと：  
>  `type ccc = ..;; (* 実行成功 ＊） let c : ccc = object end;;`  
>  一行目は実行成功しました（この文法は間違っていないと証明できる）、最後には実行失敗しました（`Error: This expression has
> type < > but an expression was expected of type ccc`）。


CC BY-SA 4.0
2022-04-05T10:07:39.850
88181
2022-04-06T00:44:16.140
41314
question
ocaml
OCamlで .. （点が二つ）の使い方はいくつありますか


これは extensible variant types の記法です。

> Extensible variant types are variant types which can be extended with new
> variant constructors. Extensible variant types are defined using `..`. New
> variant constructors are added using `+=`.

<https://ocaml.org/manual/extensiblevariants.html>


CC BY-SA 4.0
2022-04-05T12:11:42.783
88184
2022-04-05T12:11:42.783
19110
88181
answer


現在の OCaml には 4種類の `..` の使い方があります。(正確な情報は文法定義
<https://github.com/ocaml/ocaml/blob/4.14/parsing/parser.mly> の DOTDOT
を見てください。) それぞれを解説するのは回答が長くなりますので、列挙だけしておきます:

  * 列多相を表す型: `< x : int; .. > `
  * 拡張可能バリアント宣言 (open variant types ともいう): `type t = ..` (@nekketsuuu さんがご指摘のもの)
  * 文字の範囲パターン: `match x with 'A' .. 'Z' -> true | _ -> false` (<https://ocaml.org/manual/patterns.html>)
  * 拡張添字記法定義: `let (.!{;..}) = e` (<https://ocaml.org/manual/indexops.html>)


CC BY-SA 4.0
2022-04-06T00:44:16.140
88190
2022-04-06T00:44:16.140
898
88181
answer