首页 > 解决方案 > Ocaml 用户自定义类型模式匹配

问题描述

这是我的类型定义:

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

以下是一些类型:

type mysub =| Abc | Bcd | Def

我也有一个清单[N Abc;N Bcd; T"("]

我想要做的是扔掉所有类型的项目T,也扔掉'type1or '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.

我该如何解决?

标签: ocaml

解决方案


在这个片段中

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"
    )

推荐阅读