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

F# F中两种部分应用方式的区别#,f#,functional-programming,F#,Functional Programming,假设我们有以下功能(身体不是很重要): 这个函数的类型是'a->'b->unit,这就是我想要的 现在我定义一个部分应用的函数: let logf x = writelogf "Hello!" x 这个函数的类型是'a->unit,这正是我所期望的。我可以将其用于任何类型的参数: logf "Test" logf 1 但如果我试图简化声明并重复调用: let logf2 = writelogf "Hello!" logf2 "Test" logf2 1 它将不再编译,因为logf2不是泛化

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

这个函数的类型是
'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个参数?

如果您已经编写了:

let logf2 = writelogf "Hello!"
您正在有效地绑定一个类型为泛型的值。如果将定义更改为函数,例如通过显式获取参数或单位类型的参数,则可以解决此问题

let logf x = writelogf "Hello!" x

let logf2() = writelogf "Hello!"
如果您有一个包含5个参数的函数,并且部分应用了一个参数,那么您需要再次明确地获取至少一个参数,但不需要重复其他3个参数

let test5 a b c d e =
    printfn "%A" (a, b, c, d, e)

let testApplyOne x = test5 "Hello!" x

让内联…
也可能是一种解决方案,这取决于您的目标。@bytebuster内联需要一个函数,而不是一个值;而对于一个函数,问题是否已经内联“解决”
let test5 a b c d e =
    printfn "%A" (a, b, c, d, e)

let testApplyOne x = test5 "Hello!" x