2017-06-14 58 views
0

我已经做了一些搜索,而且这个问题是另一篇文章的重复。我张贴这只是为了将来的参考。在F#中没有变量的SUMPRODUCT

是否可以在不明确使用变量名称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

函数组合仅在输入函数接受单个参数时才起作用。然而,在你的例子中,List.map2 (*)的结果是一个函数,它带有两个单独的参数,所以它不能用10和List.sum组成。

如果你真的想要解决这个问题有很多种方法,但我不会那样做。我认为>>在少数情况下很不错,但很适合,但试图过度使用会导致难以理解的混乱。

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

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