我在玩ES6箭头函数,运行和部分应用程序,我决定尝试一个FizzBuzz问题的功能实现:
function* range(start, stop) {
for (var i = start; i < stop; i++)
yield i
}
var map = fn => res => x => fn(x) ? res : null
var isDividedBy = dividend => divisor => divisor % dividend === 0
var mapDividedBy = x => map(isDividedBy(x))
var mappers = [
mapDividedBy(3)('Fizz'),
mapDividedBy(5)('Buzz')
]
var applyMappers = mappers => x => mappers.map(fn => fn(x)).join('') || x
var result = Array.from(range(1, 100)).map(applyMappers(mappers))
console.log(result)我的主要关注点是能够简单地将map(x => x < 10)('Zazz')添加到mappers数组中,从而轻松地添加其他任何情况,比如"print表示小于10的数字“。
你认为如何?
发布于 2016-01-04 04:19:28
map诉ifvar map = fn => res => x => fn(x) ? res : null我会将它重命名为更类似于ifThen或when的东西--至少对我来说,称这个函数为map是令人困惑的,至少考虑到map的正常用法。这是一个if,其中else总是null。
在一个更大的程序中,您可能会发现,将真/假结果作为函数而不是常量提供将更加强大,但在这里,这只会增加噪音。
你的vars大部分可能是consts。在这里并没有什么不同,但是既然你是有意成为功能性的,const会帮助你声明你的意图。
无
mapDividedBy我不认为你需要这个特殊的功能。只需将谓词和真结果传递到您的when/if:
const when = pred => trueRes => x => pred(x) ? trueRes : null
const isDividedBy = dividend => divisor => divisor % dividend === 0
const mappers = [
when(isDividedBy(3))('Fizz'),
when(isDividedBy(5))('Buzz'),
]我不确定mappers是最具描述性的名字。目前我想不出更好的办法了,所以这不是很有帮助,但是任何(纯粹的)功能都只是从输入到输出的“映射器”(S)。也许是tests?嗯。
无论如何,由于这是一个FizzBuzz,为了方便和可读性,我建议提供最后一个这样的函数:
const fizzbuzz = applyMappers(mappers)
const result = Array.from(range(1, 100)).map(fizzbuzz)我喜欢你的跑动方式。
Clojure有一个函数juxt,它执行与mappers.map(fn => fn(x))相同的功能,但看起来比较干净,是一个单独的函数:
const fizzbuzz = x => juxt(mappers)(x).join('') || x但是,这是更易读还是更晦涩,取决于您是否了解Clojure,因此我将这一点留到最后。
发布于 2016-01-04 06:11:11
您有一个很好的想法,规划扩展性。在您实现它的方式中,我看到了一个问题。
我的主要关注点是能够简单地将
map(x => x < 10)('Zazz')添加到mappers数组中,从而轻松地添加其他任何情况,比如"print表示小于10的数字“。
这根本行不通。它将根据放置在mappers数组中的位置而打印不同的内容,但是如果附加规则,它将返回1到5的内容:
Zazz
Zazz
FizzZazz
Zazz
BuzzZazz所发生的是,你是避免了必须检查的mod 15的情况下,结合mod 3和国防部5的情况。这是好的,如果这是您需要担心的全部,但如果您打算在以后添加案例,最好是明确的事情,以便您可以在您以后的规则更加灵活。
这两个更改将将未修改的数字替换为“Zazz”:
var mappers = [
mapDividedBy(15)('FizzBuzz'),
mapDividedBy(3)('Fizz'),
mapDividedBy(5)('Buzz'),
map(x => x < 10)('Zazz')
]
var applyMappers = mappers => x => mappers.map(fn => fn(x)).filter(x => x).shift() || xhttps://codereview.stackexchange.com/questions/115743
复制相似问题