这是我的类型定义:
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.
我该如何解决?
答案 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"
)