点免费功能能够内联吗?

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)

显然inlinecurried函数似乎是不可能的.因此,无论何时mycurried被调用,inlined即使myfunctioninlined正确的也不会得到,是否正确?

那么这可以被视为咖喱功能的缺点之一吗?

Gus*_*Gus 5

我认为你的问题是是否可以内联一个无函数.

您发现的限制不是因为咖喱功能.请注意,在您的示例中,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).我知道我的代码是纯粹的,所以我不关心它是否每次执行.