gpt4 book ai didi

F# 部分应用第二个参数

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

在 F# 中,如果我采用带有两个参数的函数,例如 mod (%):

13 % 10
// val it : int = 3

这与
(%) 13 10
// val it : int = 3

有什么办法可以用管道符号来写它,把 13 柯里化(Currying)?

显然,“双参数函数”实际上是一个返回中间函数的单参数函数。所以可以管
10 |> (%) 13
// val it : int = 3

但是,我需要另一种方式,即管道第一个参数 13,部分应用第二个参数 10,但不是第一个。

语言中是否有任何东西可以帮助做到这一点,而无需每次都创建额外的 lambda,即避免以下情况?
13 |> (fun x -> x % 10)

最佳答案

没有内置的标准方法可以做到这一点。此外,由于函数应用程序的工作方式,不可能这样做:只要你写 (%) 13 ,您已经应用了第一个参数,因为函数应用程序在 F# 中具有最高且不可配置的优先级。

当然,你可以让自己成为一个特殊的函数来产生一个“奇怪”的函数应用程序——一个应用第二个参数并为第一个参数留下一个洞的应用程序:

let ap f x = fun y -> f y x

进而:
let x = 13 |> ap (%) 10
> x : int = 3

顺便提一下,函数 ap是 ML 语言中的半标准出现,通常称为 flip ,因为它所做的是“翻转”参数的顺序:
let flip f x y = f y x

或者,您甚至可以将其变成运算符:
let (-*-) = flip

进而:
let x = 13 |> (%) -*- 10
> x : int = 3

然而,这种诡计很快就会变得难以理解。在实践中,最好只声明一个满足您需要的函数:
let mod10 x = x % 10

进而:
let x = 13 |> mod10

或者,如果您真的需要它非常通用:
let mod' x y = y % x

进而:
let x = 13 |> mod' 10

关于F# 部分应用第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51730560/

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