SML 中的数据类型和类型未按预期工作
datatype and type in SML not working as intended
我正在尝试基于 monadic parsing paper 实现一个小的解析库。我想用 SML(NJ) 来做,因为我正在学习 SML。
这是我目前的情况:
type 'a parse_data = ('a * char list);
type 'a parse_result = 'a parse_data list;
type 'a parser = char list -> 'a parse_data list;
datatype 'a parse_result = ParseFailure
| ParseSuccess of 'a parse_result;
那我尝试如下使用:
ParseSuccess ([("a", [#"a"]), ("b", [#"b"])]: string parse_result);
这给出了以下错误:
stdIn:21.15-21.66 Error: expression doesn't match constraint [tycon mismatch]
expression: (string * char list) list
constraint: string parse_result
in expression:
("a",#"a" :: nil) :: ("b",#"b" :: nil) :: nil: string parse_result
我认为这很奇怪,因为我认为我已经使用 type
声明将 ('a * char list) list
与 'a parse_result
别名化了。所以我尝试更深入地研究这个问题并尝试以下操作:
([("a", [#"a"]), ("b", [#"b"])]: string parse_result);
再次出错,现在符合预期:
stdIn:22.2-22.53 Error: expression doesn't match constraint [tycon mismatch]
expression: (string * char list) list
constraint: string parse_result
in expression:
("a",#"a" :: nil) :: ("b",#"b" :: nil) :: nil: string parse_result
所以我尝试定义 datatype
而没有类型别名 parse_result
如下:
datatype 'a parse_result = ParseFailure
| ParseSuccess of ('a * char list) list;
然后突然它起作用了:
([("a", [#"a"]), ("b", [#"b"])]);
val it = [("a",[#"a"]),("b",[#"b"])] : (string * char list) list
- ParseSuccess [("a", [#"a"]), ("b", [#"b"])];
val it = ParseSuccess [("a",[#"a"]),("b",[#"b"])] : string parse_result
我不明白,为什么它不接受我的类型别名 string parse_result
代替 (string * char list) list
。那不应该工作吗?我如何定义 'a parse_result
才能使用它而不是 ('a * char list) list
?
我的 SMLNJ 版本是:Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
datatype
的命名有误。它与之前定义的 type
同名。一旦重命名,错误就消失了。工作代码是:
type 'a parse_data = ('a * char list);
type 'a parse_result = 'a parse_data list;
type 'a parser = char list -> 'a parse_result;
datatype 'a result = ParseFailure
| ParseSuccess of 'a parse_result;
我正在尝试基于 monadic parsing paper 实现一个小的解析库。我想用 SML(NJ) 来做,因为我正在学习 SML。
这是我目前的情况:
type 'a parse_data = ('a * char list);
type 'a parse_result = 'a parse_data list;
type 'a parser = char list -> 'a parse_data list;
datatype 'a parse_result = ParseFailure
| ParseSuccess of 'a parse_result;
那我尝试如下使用:
ParseSuccess ([("a", [#"a"]), ("b", [#"b"])]: string parse_result);
这给出了以下错误:
stdIn:21.15-21.66 Error: expression doesn't match constraint [tycon mismatch]
expression: (string * char list) list
constraint: string parse_result
in expression:
("a",#"a" :: nil) :: ("b",#"b" :: nil) :: nil: string parse_result
我认为这很奇怪,因为我认为我已经使用 type
声明将 ('a * char list) list
与 'a parse_result
别名化了。所以我尝试更深入地研究这个问题并尝试以下操作:
([("a", [#"a"]), ("b", [#"b"])]: string parse_result);
再次出错,现在符合预期:
stdIn:22.2-22.53 Error: expression doesn't match constraint [tycon mismatch]
expression: (string * char list) list
constraint: string parse_result
in expression:
("a",#"a" :: nil) :: ("b",#"b" :: nil) :: nil: string parse_result
所以我尝试定义 datatype
而没有类型别名 parse_result
如下:
datatype 'a parse_result = ParseFailure
| ParseSuccess of ('a * char list) list;
然后突然它起作用了:
([("a", [#"a"]), ("b", [#"b"])]);
val it = [("a",[#"a"]),("b",[#"b"])] : (string * char list) list
- ParseSuccess [("a", [#"a"]), ("b", [#"b"])];
val it = ParseSuccess [("a",[#"a"]),("b",[#"b"])] : string parse_result
我不明白,为什么它不接受我的类型别名 string parse_result
代替 (string * char list) list
。那不应该工作吗?我如何定义 'a parse_result
才能使用它而不是 ('a * char list) list
?
我的 SMLNJ 版本是:Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
datatype
的命名有误。它与之前定义的 type
同名。一旦重命名,错误就消失了。工作代码是:
type 'a parse_data = ('a * char list);
type 'a parse_result = 'a parse_data list;
type 'a parser = char list -> 'a parse_result;
datatype 'a result = ParseFailure
| ParseSuccess of 'a parse_result;