我正在尝试做的一个非常简单的例子:我知道可以这样写:

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 值元组“折叠”为单个值;

  • 这种方法有很多缺点,包括 fDate1fDate2 都会被评估,而这可能不是必需的,额外的元组会降低性能等等。

    关于f# - 使用 F# 变得更加地道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24079465/

    10-10 15:07