F#中的SUMPRODUCT没有变量

时间:2017-06-14 09:42:17

标签: f#

我已经完成了一些搜索,这个问题与另一篇文章重复。我发布此信息仅供将来参考。

是否可以在不明确使用变量名x,y?

的情况下定义SUMPRODUCT

原始功能:

let SUMPRODUCT x y = List.map2 (*) x y |> List.sum
SUMPRODUCT [1;4] [3;25]    // Result: 103

我希望这样做:

// CONTAINS ERROR!
let SUMPRODUCT = (List.map2 (*)) >> List.sum
// CONTAINS ERROR!

但是F#回来时出错了。

我已经在另一篇文章中找到了解决方案,但如果您有任何建议,请告诉我。谢谢。

2 个答案:

答案 0 :(得分:2)

仅当输入函数采用单个参数时,函数组合才有效。但是,在您的示例中,List.map2 (*)的结果是一个带有两个单独参数的函数,因此使用List.sum无法使用>>轻松编写。

如果你真的想要解决这个问题有很多种方法,但我不会这样做。我认为>>在一些罕见的情况下很好用,但是过度使用它会导致难以理解的混乱。

在某些函数式语言中,核心库定义了帮助器,用于将带有两个参数的函数转换为一个带元组的函数,反之亦然。

let uncurry f (x, y) = f x y
let curry f x y = f (x, y)

您可以使用这两个来定义sumProduct,如下所示:

let sumProduct = curry ((uncurry (List.map2 (*))) >> List.sum)

现在它是无点的并且理解它是一个有趣的心理挑战,但是出于所有实际目的,没有人能够理解代码并且它也比原始显式版本更长:

let sumProduct x y = List.map2 (*) x y |> List.sum

答案 1 :(得分:1)

根据这篇文章:

What am I missing: is function composition with multiple arguments possible?

有时"指出"样式代码优于" pointfree"样式代码,并没有很好的方法将原始函数的类型差异统一到我希望实现的目标。