【发布时间】:2016-08-11 01:22:43
【问题描述】:
我目前正在做一些来自exercism.io 的练习。其中一项练习是将序列中的所有数字相加,这些数字是来自不同序列的一个或多个数字的倍数。将问题拆分为更小的函数似乎是个好主意,我想出了这个:
let multipleOf m n =
n % m = 0
let anyMultipleOf (m: int list) n =
m
|> Seq.exists (multipleOf n)
let sumOfMultiples m n =
[1..n-1]
|> Seq.filter (anyMultipleOf m)
|> Seq.sum
我的想法是,我可以使用部分应用程序将m 参数“烘焙”到我的(any)multipleOf 函数中。但是这段代码并没有按照我想要的方式工作,因为Seq.exists (multipleOf n) 实际上将n 应用为我的m 参数。
如何在不必颠倒multipleOf 函数的参数顺序的情况下重构此代码?
注意:我想要一个在我的 anyMultipleOf 函数中使用我的 multipleOf 函数的解决方案。此解决方案有效,但不重用我的第一个功能:
let anyMultipleOf (m: int list) n =
m
|> Seq.exists (fun x -> n % x = 0)
【问题讨论】:
-
multipleOf和anyMultipleOf都应该真正具有相反顺序的参数。参数的定义从更一般到更具体。重用(any)MultipleOf x比目前的方式更有意义 -
我的思维过程正好相反。就像检查我对部分应用序列的任何值一样:
let anyMultipleOfMyNumbers = anyMultipleOf [3;5;7] -
这个也很好用:
let filterMultiplesOf5 numlist = numlist |> Seq.filter (multipleOf 5)
标签: f#