F#中两种部分应用方式的区别

时间:2015-11-03 21:34:53

标签: f# functional-programming

假设我们有以下功能(正文不是很重要):

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个参数?

1 个答案:

答案 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