假设我们有以下功能(正文不是很重要):
let writelogf greeting x =
Printf.printf "%A" greeting
Printf.printf "%A" x
这个函数的类型是'a -> 'b -> unit
,这就是我想要的。
现在我定义了一个部分应用的函数:
let logf x = writelogf "Hello!" x
这个函数的类型是'a -> unit
,这是我所期望的。我可以使用任何类型的参数:
logf "Test"
logf 1
但如果我试图简化声明并重复调用:
let logf2 = writelogf "Hello!"
logf2 "Test"
logf2 1
它将不再编译,因为logf2
未被推广,它具有类型string -> unit
(从第一次使用开始)。
为什么?如果我有一个带有5个参数的函数并且我需要部分应用一个参数,我是否必须重复其他4个参数?
答案 0 :(得分:3)
如果你写了:
let logf2 = writelogf "Hello!"
您正在有效地绑定一个值,其类型是通用的。如果您将定义更改为函数,例如通过明确地获取参数或单元类型的参数,您可以解决问题。
let logf x = writelogf "Hello!" x
let logf2() = writelogf "Hello!"
如果你有一个带有5个参数的函数并且你部分应用了一个参数,那么你需要再次明确地使用一个参数,但不需要重复其他参数。
let test5 a b c d e =
printfn "%A" (a, b, c, d, e)
let testApplyOne x = test5 "Hello!" x