OCaml中如何在match表达式内调用2个及以上函数?
OCaml match分支多函数调用问题解答
报错原因
你遇到的This is not a function it cannot be applied报错属于语法解析导致的语义错误:OCaml中(foo1 x) (foo2 y)的写法会被识别为函数调用逻辑,即把foo1 x的返回值当作函数,传入foo2 y作为参数执行。只要foo1的返回值不是函数类型,就会触发该报错。
多函数调用实现方法
OCaml语法完全支持在match分支内调用任意数量的函数,根据使用场景分为两类常用写法:
1. 顺序执行(多用于带副作用的操作,仅保留最后一个函数的返回值)
这类场景使用顺序运算符;即可,你之前使用出错大概率是未处理运算符优先级:多表达式用;连接时,需要用begin ... end或括号包裹整个表达式块,避免和match的语法结构冲突。
示例代码:
let rec foo (l : 'a list) = match l with (* 注意:[x; y]匹配含2个元素的列表,[x,y]匹配仅含1个二元组元素的列表 *) | [x; y] -> begin (* 若前序函数返回值不是unit类型,用ignore包裹消除编译器警告 *) ignore (foo1 x); foo2 y (* 整个分支的返回值为foo2 y的执行结果 *) end | _ -> doSome
2. 保留所有函数的返回值
如果需要同时获取多个函数的执行结果,直接将调用组合为复合值即可,最常见的是封装为元组:
let rec foo (l : 'a list) = match l with | [x; y] -> (foo1 x, foo2 y) (* 分支返回值为两个函数结果组成的二元组 *) | _ -> (doSome, doSome)
如果需要将多个函数的结果传入第三个函数处理,直接按参数顺序传入即可:
| [x; y] -> bar (foo1 x) (foo2 y) (* 先后执行foo1、foo2,再调用bar传入两个结果 *)
内容的提问来源于stack exchange,提问作者hexaquark
相关产品推荐
相关产品推荐

