gpt4 book ai didi

f# - 反转部分函数参数顺序

转载 作者:行者123 更新时间:2023-12-02 01:39:09 25 4
gpt4 key购买 nike

我想写List.map (fun x -> x % 3) 转换为 List.map ((%) 3) 等形式。
后者的问题在于它转化为
List.map (fun x -> 3 % x) 不是我想要的

是否可以以更简洁的方式编写List.map (fun x -> x % 3).

更多背景
F# 新手。发现能够使用部分应用程序编写简洁的表达式真是太好了。

例如对于逻辑向列表中的每个项目添加 3 可以编写为 List.map ((+) 3)

但是,这不适用于位置敏感的运算,例如除法和模数。
例如。我将 List.map ((/) 3) 读作 - 对于列表中的每个项目,除以 3。
但实际的逻辑实际上是将每个项目划分为 3 个映射。

[12; 24; 36; 48] |> List.map ((/) 3)
// expect [4; 8; 12; 16]
// actual [3/12; 3/24; 3/36; 3/48] // type discrepancy. but just an example.

来自JL0PD的回答,我认为 F# 无法实现我想要的功能(目前)。


回顾

由于柯里化(Currying)/参数定位的性质,我想要的东西是不可行的。例如。
(/) 12 3 = 12 / 3  // left hand op and right hand op are equivalent.
// val it: bool = true

最佳答案

参数顺序不正确的函数的常见解决方法是flip函数

let flip f x y = f y x

使用这个函数你可以编写

List.map (flip (%) 3)

不太通用,但更清楚的是创建专门的函数,例如 mod

let mod y x = x % y
List.map (mod 3)

但我不认为这会增加可读性和/或可维护性。我会使用当前版本

关于f# - 反转部分函数参数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71909740/

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