col*_*ang 6 f# inline currying pointfree
let inline myfunction x y = ...
let inline mycurried = myfunction x // error, only functions may be marked inline
Run Code Online (Sandbox Code Playgroud)
显然inline
curried函数似乎是不可能的.因此,无论何时mycurried
被调用,inlined
即使myfunction
是inlined
正确的也不会得到,是否正确?
那么这可以被视为咖喱功能的缺点之一吗?
我认为你的问题是是否可以内联一个无点函数.
您发现的限制不是因为咖喱功能.请注意,在您的示例中,curried函数位于右侧,在左侧,您具有无点函数.
F#只允许函数内联,而不是常量.
我原则你可能会认为这可以被视为一个错误,因为类型推断足够聪明,可以发现这是一个(无点)函数,但是阅读Tomas关于副作用的注释.
显然,当编译器在左侧只找到一个标识符时,它会因此错误而失败:
let inline myfunction x y = x + y
let inline mycurried = myfunction 1
--> Only functions may be marked 'inline'
Run Code Online (Sandbox Code Playgroud)
正如Brian所说,解决方法是在双方都添加一个显式参数:
let inline mycurried x = (myfunction 1) x
Run Code Online (Sandbox Code Playgroud)
但是你的功能不再是无点的,它与以下内容相同:
let inline mycurried x = myfunction 1 x
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是添加一个显式泛型参数:
let inline mycurried<'a> = myfunction 1
Run Code Online (Sandbox Code Playgroud)
当通用参数明确存在于左侧时,它会编译.
我希望他们删除错误消息并将其发送警告,例如:
Since only functions can be 'inline' this value will be compiled as a function.
Run Code Online (Sandbox Code Playgroud)
UPDATE
感谢Tomas的回答(和你的downvote).
我个人认为这应该是一个警告,所以你知道你的代码的语义最终会改变,但是由你来决定做什么.
你说内联是"只是一个优化",但这并不完全正确:
.简单地将所有功能内联,并不能保证最佳代码.
.您可能想要使用静态约束,然后必须使用内联.
我希望能够定义我的(种类)通用常量,就像F#库已经做的那样(即:GenericZero和GenericOne).我知道我的代码是纯粹的,所以我不关心它是否每次执行.