我已经完成了一些搜索,这个问题与另一篇文章重复。我发布此信息仅供将来参考。
是否可以在不明确使用变量名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#回来时出错了。
我已经在另一篇文章中找到了解决方案,但如果您有任何建议,请告诉我。谢谢。
答案 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"样式代码,并没有很好的方法将原始函数的类型差异统一到我希望实现的目标。