【发布时间】:2021-09-04 15:36:51
【问题描述】:
TL DR:我正在尝试创建一个函数包装器。包装后的函数不接受参数,但返回一个值。
我想这样做的原因是为了创建一个类似于“锁”但用于信号量的函数。
在这里
let functionWrapper (param1) (f:(unit -> 'a)) =
printfn "Calling function %s" param1
f()
签名:(string -> (unit -> 'a) -> 'a)
到目前为止,一切顺利
现在让我们用一个参数来丰富 functionWrapper
let functionWrapperFoo = functionWrapper "Foo"
签名:((unit -> obj) -> obj)
出于某种原因,'a 在这里变成了 obj..
现在我终于想用这个函数来包装另一个了。
但是类型推断会将functionWrapperFoo的签名更改为((unit -> int) -> int),这会阻止以后将该函数与其他类型一起使用。
let resultFooInt =
functionWrapperFoo (
fun _ ->
(42)
)
// Because I am using a string as a return type now, this one bellow won't compile
let resultFooString =
functionWrapperFoo (
fun _ ->
"42"
)
为什么在第一次部分应用后我不能保持这个函数通用?
我确实找到了解决方法,但 我真的不明白这是什么原因。
我看到一些帖子提到了类似的部分应用程序,但在我的情况下,我的包装函数没有参数
Keeping partially applied function generic
完整的原始代码
let functionWrapper (param1) (f:(unit -> 'a)) =
printfn "Calling function %s" param1
f()
let functionWrapperFoo = functionWrapper "Foo"
let resultFooInt =
functionWrapperFoo (
fun _ ->
(42)
)
let resultFooString =
functionWrapperFoo (
fun _ ->
"42"
)
解决方法
let functionWrapper (param1) (f:(unit -> 'a)) =
printfn "Calling function %s" param1
f()
let functionWrapperFoo() = functionWrapper "Foo"
let resultFooInt =
functionWrapperFoo() (
fun _ ->
(42)
)
let resultFooString =
functionWrapperFoo() (
fun _ ->
"42"
)
【问题讨论】:
标签: generics f# partial-application