我刚刚在OCaml至Real World OCaml学习过一些有关GADT的内容,并想设法将其中第一点语言翻译成口译员,从而使用男子。
最确切的定义与实例完全相同。 这里是:
type _ value =
| Int : int -> int value
| Bool : bool -> bool value
type _ expr =
| Value: a value -> a expr
| Eq : int expr * int expr -> bool expr
| Plus : int expr * int expr -> int expr
| If : bool expr * a expr * a expr -> a expr
let eval_value : type a. a value -> a = function
| Int x -> x
| Bool x -> x ;;
let rec eval: type a. a expr -> a = function
| Value v -> eval_value v
| If (c, t, e) -> if eval c then eval t else eval e
| Eq (x, y) -> eval x = eval y
| Plus (x, y) -> eval x + eval y;
这里是我的法理和教法特写。
{
open Parser
exception Error of string
}
rule token = parse
| [ ] {token lexbuf}
|
{Lexing.new_line lexbuf; token lexbuf}
| "if" {IF}
| "then" {THEN}
| "else" {ELSE}
| = {EQ}
| + {PLUS}
| "true" {BOOL (true)}
| "FALSE" {BOOL (false)}
| [ 0 - 9 ]+ as i {NUM (int_of_string i)}
| - [ 0 - 9 ]+ as i { NUM (int_of_string i) }
| eof {EOF}
| _ { raise (Error (Printf.sprintf "At offset %d: unexpected character.
" (Lexing.lexeme_start lexbuf))) }
%{
open Ast
%}
%token <int> NUM
%token <bool> BOOL
%token PLUS
%token IF
%token THEN
%token ELSE
%token EQ
%token EOF
%left PLUS
%start < a Ast.expr> expr_toplevel
%%
expr_toplevel:
| e = expr EOF {e}
expr:
| x = expr PLUS y = expr {Plus (x, y)}
| IF c = expr THEN x = expr ELSE y = expr {If (c, x, y)}
| x = expr EQ y = expr {EQ (x, y)}
| b = BOOL {Value (Bool b)}
| n = NUM {Value (Int n)}
所有这一切,以及上述法典未能建立,其错误是:
File "bin/parser.mly", line 27, characters 18-26:
Error: This expression has type bool value
but an expression was expected of type int value
Type bool is not compatible with type int
这里指的是:
| b = BOOL {Value (Bool b)}
这一错误与我们在第<条码>、当地摘要型和多形态再入侵/代码”第一组代码中发现的错误完全相同,作者试图将GADT视为普通差异。 这里的问题是同一问题吗? 如果是,我如何能够确定这一点,使之发挥作用。
男子手法中没有多少关于东帝汶国防军的内容。 这一点在国旗上被提及——投机。 我已尝试过这种变化,但没有任何变化。