ocaml - Ocaml 用户自定义类型模式匹配
问题描述
这是我的类型定义:
type ('type1, 'type2) symbol =
| N of 'type1
| T of 'type2
以下是一些类型:
type mysub =| Abc | Bcd | Def
我也有一个清单[N Abc;N Bcd; T"("]
。
我想要做的是扔掉所有类型的项目T
,也扔掉'type1
or '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.
我该如何解决?
解决方案
在这个片段中
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"
)
推荐阅读
- amazon-web-services - AWS CloudTrail 和 VPC Flow 日志 S3 归档技术
- ruby-on-rails - Rails,模板上显示重复的模型
- python - 查找所有带有 id(不是类)的 div
美丽的汤 - python - gcloud recaptcha 企业 - 创建评估
- javascript - javascript 行为的动画易用性和时间安排:流畅;
- r - 通过采用用户选择的变量来实现闪亮的 R App 相关性
- reactjs - 使用 axios 处理 API 错误响应(多个文件)
- python - 如何根据单独的熊猫列着色条
- flutter - AndroidManifest 中缺少默认通知通道元数据。Flutter 将使用默认值
- python - Spyder v5.0.5(及更早版本)在 MacOS Big Sur 11.5.1 中无法正常运行