我正在寻找一种方法来解决这种非常特定的情况:我有一个函数工厂toF
,它采用函数参数g
并基于它创建一个结果函数f
无法在F#中创建函数的泛型部分应用程序
let toF g =
let f x = g x
f
let f = toF id
的问题是,我得到一个
error FS0030: Value restriction. The value 'f' has been inferred to have generic type val f : ('_a -> '_a) Either make the arguments to 'f' explicit or, if you do not intend for it to be generic, add a type annotation.
我可以添加类型注释(这我不急于做的),或者我可以把它改写这样的:
let f' g x = g x
let f x = f' id x
我不喜欢做这种方式,因为如果我每次做的话,我叫f
我拨打另一个电话到f'
沿途指定g
。虽然第一个示例将g
保存在闭包中,并且只需要一个呼叫。
更新版(托马斯)
我已经试过你的建议。
let toF g =
printfn "Creating f using g"
let f x =
printfn "x: %A" x
g x
f
let f x = toF id x
let ``test``() =
1 |> f |> f |> ignore
基本上什么正在发生的事情是,每次我打电话给函数f
它首先调用toF id
得到一个由函数,然后才调用由上x
功能。
Creating f using g
x: 1
Creating f using g
x: 1
所以基本上的组成是在通过后续调用每次调用f
到toF
创建。但这正是我想要避免的。通过定义let f = toF id
,我希望能得到一个闭合时间,然后能够立即调用它。所以我期待的输出为:
Creating f using g
x: 1
x: 1
更新2
下无法正常工作或为同样的原因:
let toF g =
printfn "Creating f using g"
let f x =
printfn "x: %A" x
g x
f
let f() = toF id
let fg = f()
:
如果你真的需要在不同类型的呼叫
f
,那么您可以在一个通用型包装它我不明白它是如何工作的:'让FX =因为有2个参数的'TOF ID x' TOF ID x'不应该工作而作为申报'toF'仅得到一个参数'g'。我的意思是x只是被忽略或者是什么? –'让FX ='定义一个函数(恰好返回功能服用另一种说法),而'令f ='定义的值(这实际上是两个参数的函数) –
这仅仅是一个简单的语法条件 - 它作为一个函数(至少有一些参数) –