gpt4 book ai didi

f# - 您如何在 F# 或任何函数式语言中对第二个(或第三个、第四个、...)参数进行 curry?

转载 作者:行者123 更新时间:2023-12-03 22:54:55 25 4
gpt4 key购买 nike

我刚刚开始使用 F#,看看如何使用 currying 将第一个参数预加载到函数中。但是如何使用第二个、第三个或任何其他参数来做到这一点?命名参数会使这更容易吗?是否有任何其他函数式语言具有命名参数或其他方式使柯里化(Currying)对参数顺序无动于衷?

最佳答案

可以在不声明任何内容的情况下执行此操作,但我同意 Briana lambda or a custom function is probably a better solution .

我发现我最常希望将其用于除法或减法的部分应用。

> let halve = (/) >> (|>) 2.0;;
> let halfPi = halve System.Math.PI;;

val halve : (float -> float)
val halfPi : float = 1.570796327

概括地说,我们可以声明一个函数 applySecond :
> let applySecond f arg2 = f >> (|>) arg2;;
val applySecond : f:('a -> 'b -> 'c) -> arg2:'b -> ('a -> 'c)

为了遵循逻辑,这样定义函数可能会有所帮助:
> let applySecond f arg2 =
- let ff = (|>) arg2
- f >> ff;;
val applySecond : f:('a -> 'b -> 'c) -> arg2:'b -> ('a -> 'c)

现在 f是来自 'a 的函数至 'b -> 'c .这是由 ff 组成, 来自 'b -> 'c 的函数至 'c部分应用 arg2 的结果到正向管道运营商。此函数适用于特定的 'barg2 传递的值对其论点。所以当我们撰写 fff , 我们从 'a 得到一个函数至 'c使用 'b 的给定值争论,这正是我们想要的。

将上面的第一个示例与以下示例进行比较:
> let halve f = f / 2.0;;
> let halfPi = halve System.Math.PI;;

val halve : f:float -> float
val halfPi : float = 1.570796327

还要比较这些:
let filterTwoDigitInts = List.filter >> (|>) [10 .. 99]
let oddTwoDigitInts = filterTwoDigitInts ((&&&) 1 >> (=) 1)
let evenTwoDigitInts = filterTwoDigitInts ((&&&) 1 >> (=) 0)

let filterTwoDigitInts f = List.filter f [10 .. 99]
let oddTwoDigitInts = filterTwoDigitInts (fun i -> i &&& 1 = 1)
let evenTwoDigitInts = filterTwoDigitInts (fun i -> i &&& 1 = 0)

或者,比较:
let someFloats = [0.0 .. 10.0]
let theFloatsDividedByFour1 = someFloats |> List.map ((/) >> (|>) 4.0)
let theFloatsDividedByFour2 = someFloats |> List.map (fun f -> f / 4.0)

lambda 版本似乎更容易阅读。

关于f# - 您如何在 F# 或任何函数式语言中对第二个(或第三个、第四个、...)参数进行 curry?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1911096/

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