嵌套高阶函数参数添加类型标注时出现Syntax error语法错误如何解决
问题原因分析
你代码的语法错误核心是参数标签的标注规则不符合你所用的ML系语言(OCaml/F#)的语法要求,分两种常见场景说明:
- 如果你使用的是OCaml:带标签的函数参数在类型声明中需要加
~前缀,你缺失了该标记,编译器无法识别third:为参数标签,会将其判定为非法类型语法,因此抛出type expected报错。 - 如果你使用的是F#:F#不支持在嵌套的函数类型声明中给参数加标签,仅允许在直接定义函数的入参位置标注参数标签。
修正写法
OCaml 版本
给嵌套参数的标签加上~前缀即可:
let first (second: (~third: ('a -> 'b) -> 'a)) : 'a = (* 这里写你的函数实现 *) failwith "todo"
调用second的时候需要显式指定标签:
(* 调用示例 *) let result = first (fun ~third -> third 123)
F# 版本
F#无法在类型签名里给嵌套函数加参数标签,你可以去掉标签仅保留类型结构,在实际传入函数实现的时候再标注参数名:
let first (second: (('a -> 'b) -> 'a)) : 'a = // 这里写你的函数实现 failwith "todo" // 传入函数实现时可以正常标注参数名 let sampleSecond (third: int -> string) = third 456 let result = first sampleSecond
内容的提问来源于stack exchange,提问作者LargeLizard
相关产品推荐
相关产品推荐

