我认为您的问题是 point-free 函数是否可以内联。
您发现的限制不是因为柯里化函数。
请注意,在您的示例中,柯里化函数在右侧,在左侧您有一个无点函数。
F# 只允许内联函数,而不是常量。
我原则上你可能认为这可以被认为是一个错误,因为类型推断足够聪明,可以发现这是一个(无点)函数,但请阅读 Tomas 关于副作用的注释。
显然,当编译器仅在左侧找到一个标识符时,它会因以下错误而失败:
let inline myfunction x y = x + y
let inline mycurried = myfunction 1
--> Only functions may be marked 'inline'
正如 Brian 所说,一种解决方法是在两边都添加一个显式参数:
let inline mycurried x = (myfunction 1) x
但是你的函数不再是无点的,它与:
let inline mycurried x = myfunction 1 x
另一种方法可能是添加显式泛型参数:
let inline mycurried<'a> = myfunction 1
当泛型参数显式出现在左侧时,它会编译。
我希望他们删除错误消息并将其变为警告,例如:
Since only functions can be 'inline' this value will be compiled as a function.
更新
感谢 Tomas 的回答(以及您的反对票)。
我个人的意见是这应该是一个警告,所以你知道你的代码的语义最终会改变,但接下来要由你决定做什么。
你说内联“只是一种优化”,但这并不完全正确:
。简单地将所有函数内联并不能保证最佳代码。
。您可能想使用静态约束,然后必须使用内联。
我希望能够定义我的(某种)通用常量,就像 F# 库已经做的那样(即:GenericZero 和 GenericOne)。我知道我的代码会很纯净,所以我不在乎它是否每次都执行。