我正在尝试做的一个非常简单的例子:我知道可以这样写:
let myFunc = anotherFunc
代替
let myFunc = fun x -> anotherFunc x
我有两个函数 fDate1, fDate2 - 都是 DateTime -> bool 类型。我需要构造一个函数,该函数接受一个日期并验证 fDate1、fDate2 中的任何一个是否返回 true。现在我发明了以下表达式:
let myDateFunc = fun x -> (fDate1 x) || (fDate2 x)
有没有更好的方法来做这些(例如使用“>>”或高阶函数)?
最佳答案
正如其他答案所说,您目前的方法很好。没有说的是 惯用风格通常会产生可读性较差的代码 。因此,如果您在实际项目中工作并期望其他开发人员理解您的代码,则不建议在不必要的函数组合上走得太远。
但是,出于自我教育的目的,您可以考虑以下技巧,有点像 FORTH 风格:
// Define helper functions
let tup x = x,x
let untup f (x,y) = f x y
let call2 f g (x,y) = f x, g y
// Use
let myFunc =
tup
>> call2 fDate1 fDate2
>> untup (||)
在这里,您通过一系列转换传递原始值
x
:or
运算符的 bool 值元组“折叠”为单个值; 这种方法有很多缺点,包括
fDate1
和 fDate2
都会被评估,而这可能不是必需的,额外的元组会降低性能等等。关于f# - 使用 F# 变得更加地道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24079465/