ocaml - 模式匹配期间的 Ocaml 语法错误
问题描述
这是我的代码:
type mass = Inf | P of int
let som = fun
|Inf _ | _ Inf -> Inf
| (P a) (P b) -> P (a+b)
我收到以下错误:
line 5, characters 0-1:
Error: Syntax error
我完全不明白如何在这里得到语法错误。我试图用 : match ab 替换乐趣,但我仍然得到相同的语法。
我也试着放一些:“;” 但它仍然不起作用。
解决方案
这些模式:
Inf _
_ Inf
在 OCaml 中没有意义。它们都由一种模式直接跟随另一种模式组成。(Inf
模式匹配Inf
构造函数,并且_
是匹配任何东西的通配符。)但是在 OCaml 中没有模式由一个模式跟随另一个模式组成。
这种模式也是如此:
(P a) (P b)
如果这些模式确实有意义,那么它们似乎与功能应用程序相匹配。但是模式不能拆开一个函数应用程序,它只能拆开数据构造函数(列表、元组等)。
您希望此模式匹配的示例 OCaml 值是什么?
更新
您似乎在说该值P 2, P 3
应与第二种模式匹配。OCaml 中的值P 2, P 3
是一个元组。它将匹配此模式:
(P a), (P b)
请注意,逗号是必需的。逗号是创建元组的构造函数。
更新 2
嗯,另一个错误是fun
关键字只允许一个模式。对于多种模式,您需要使用function
关键字。这是您的函数的正确版本(假设您希望它处理 type 的值对mass
)。
type mass = Inf | P of int
let som = function
|Inf, _ | _, Inf -> Inf
| (P a), (P b) -> P (a+b)
更新 3
在 OCaml 中,具有柯里化函数更为惯用。令我震惊的是,这可能是您想要拥有相邻模式的原因。要获得咖喱版本,som
您需要使用明确的match
. 也fun
不够function
灵活。
它看起来像这样:
let som x y =
match x, y with
| Inf, _ | _, Inf -> Inf
| P a, P b -> P (a + b)
推荐阅读
- sql - 如何进行 Sql 查询,该查询将采用具有 AND OR () 等关键字的搜索词及其组合
- sorting - 如何在 Spark DataFrame 上应用部分排序?
- c++ - 如何检查调用者是否仍然存在于任务回调中
- html - DIV 边界不对齐
- html - 如何删除底部伪元素前后的空格?
- r - r Kohonen map - 如何找到一个数据集的位置?
- javascript - Three.js - 画布元素未正确显示。只看到黑匣子
- java - 为什么验证 Spring 控制器请求参数需要 @Validated?
- hibernate - Hibernate 双向 OneToOne 连接获取产生 n+1 个查询
- mysql - 无法在 Windows 上连接到 MySQL 8.0.21 的 localhost:3306 (2003)