Ocaml用户定义的类型模式匹配

时间:2019-04-08 22:38:35

标签: ocaml

这是我的类型定义:

type ('type1, 'type2) symbol =
  | N of 'type1
  | T of 'type2

以下是一些类型:

type mysub =| Abc | Bcd | Def

我还有一个列表[N Abc;N Bcd; T"("]

我想做的是丢弃所有类型为T的项目,并丢弃'type1'type2。因此,理想的结果是[Abc; Bcd]

但是当我尝试这段代码时:

List.map (fun x-> match x with N (a)->a |T (b) ->b ) (List.filter (fun x->match x with
N (type1) ->true |T (type2) -> false) [N Abc;N Bcd; T"("]);;

它给我以下消息:

Error: This expression has type (mysub, string) symbol list
       but an expression was expected of type
         (mysub, mysub) symbol list
       Type string is not compatible with type mysub.

我该如何解决?

1 个答案:

答案 0 :(得分:0)

在此片段中

List.map
    (fun x -> match x with
    N a -> a
    T b -> b
    )

两个匹配项的返回类型不同。如果列表中有任何T b元素,则b将是一个字符串,并且编译器不知道没有任何这样的元素。由于您知道没有任何问题,因此可以通过提供b以外的内容来解决此问题,从而解决此问题。像这样:

List.map
    (fun x -> match x with
    N a -> a
    T _ -> Abc
    )

甚至是这样:

List.map
    (fun x -> match x with
    N a -> a
    T _ -> failwith "This can't happen"
    )