【发布时间】:2017-09-24 20:23:06
【问题描述】:
给定以下函数
let get_or ~default =
function | Some a -> a
| None -> default
如果使用标记的参数调用此函数,它会按预期工作:
let works = get_or ~default:4 (Some 2)
但是如果省略了标签,它会以某种方式失败:
let fails = get_or 4 (Some 2)
它变得更奇怪了,然而,编译器在这里给出的错误信息是:
此表达式的类型为 int,但表达式的类型应为 ('a -> 'b) 选项
不仅编译器错误地将其推断为一个选项,而且出于某种原因,它还从众所周知的魔术师的帽子中提取了一个函数类型!所以我很自然地想知道:这到底是从哪里来的?并且对我的好奇心不太重要,为什么在这种特定情况下省略标签不起作用?
有关交互式示例,请参阅 this reason playground。
这个谜题的功劳归于@nachotoday,Reason Discord。
【问题讨论】:
-
可选标签参数实际上做有一个
option类型 -
@Bergi 虽然这不是可选的
标签: label parameter-passing ocaml type-inference