gpt4 book ai didi

f# - 自由点函数可以内联吗?

转载 作者:行者123 更新时间:2023-12-04 13:52:42 25 4
gpt4 key购买 nike

let inline myfunction x y = ...

let inline mycurried = myfunction x // error, only functions may be marked inline

显式 inline curry 函数似乎是不可能的。
因此,每当调用 mycurried时,即使 inlined正确是 myfunction,也不会获得 inlined,对吗?

那么这可以看作是 curry 函数的缺点之一吗?

最佳答案

我认为您的问题是point-free函数是否可以内联。

您发现的限制不是由于curried函数。
请注意,在您的示例中,curried函数位于右侧,而左侧则具有无点函数。

F#仅允许函数为内联函数,而不是常量。

我原则上可以考虑到类型推断足够聪明地发现它是一个(无点的)函数,但是您可以阅读Tomas的有关副作用的注释,这可能会被认为是一个bug。

显然,当编译器仅在左侧找到一个标识符时,它将因以下错误而失败:

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)。我知道我的代码将是纯代码,所以我不在乎是否每次都执行它。

关于f# - 自由点函数可以内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com