F#中无变量的sum积
我已经做了一些搜索,这个问题是另一篇文章的重复。我张贴这只是为了将来的参考 是否可以定义SUMPRODUCT而不显式使用变量名x,y 原始功能:F#中无变量的sum积,f#,F#,我已经做了一些搜索,这个问题是另一篇文章的重复。我张贴这只是为了将来的参考 是否可以定义SUMPRODUCT而不显式使用变量名x,y 原始功能: 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 //
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#返回时出现了一个错误
我已经在另一篇文章中找到了解决方案,但是如果你有任何建议,请让我知道。谢谢。根据这篇文章:
有时“有点”样式代码比“无点”样式代码好,并且没有好的方法将原始函数的类型差异统一到我希望实现的功能上。根据本文:
有时“有点”样式代码比“无点”样式代码好,并且没有好的方法将原始函数的类型差异统一到我希望实现的结果。函数组合仅在输入函数接受单个参数时有效。但是,在您的示例中,
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
函数组合仅在输入函数接受单个参数时有效。但是,在您的示例中,
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