首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FizzBuzz功能实现

FizzBuzz功能实现
EN

Code Review用户
提问于 2016-01-03 18:54:05
回答 2查看 217关注 0票数 4

我在玩ES6箭头函数,运行和部分应用程序,我决定尝试一个FizzBuzz问题的功能实现:

代码语言:javascript
复制
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的数字“。

你认为如何?

EN

回答 2

Code Review用户

回答已采纳

发布于 2016-01-04 04:19:28

mapif

代码语言:javascript
复制
var map = fn => res => x => fn(x) ? res : null

我会将它重命名为更类似于ifThenwhen的东西--至少对我来说,称这个函数为map是令人困惑的,至少考虑到map的正常用法。这是一个if,其中else总是null

在一个更大的程序中,您可能会发现,将真/假结果作为函数而不是常量提供将更加强大,但在这里,这只会增加噪音。

const

你的vars大部分可能是consts。在这里并没有什么不同,但是既然你是有意成为功能性的,const会帮助你声明你的意图。

mapDividedBy

我不认为你需要这个特殊的功能。只需将谓词和真结果传递到您的when/if

代码语言:javascript
复制
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,为了方便和可读性,我建议提供最后一个这样的函数:

代码语言:javascript
复制
const fizzbuzz = applyMappers(mappers)
const result = Array.from(range(1, 100)).map(fizzbuzz)

misc

我喜欢你的跑动方式。

Clojure有一个函数juxt,它执行与mappers.map(fn => fn(x))相同的功能,但看起来比较干净,是一个单独的函数:

代码语言:javascript
复制
const fizzbuzz = x => juxt(mappers)(x).join('') || x

但是,这是更易读还是更晦涩,取决于您是否了解Clojure,因此我将这一点留到最后。

票数 3
EN

Code Review用户

发布于 2016-01-04 06:11:11

您有一个很好的想法,规划扩展性。在您实现它的方式中,我看到了一个问题。

我的主要关注点是能够简单地将map(x => x < 10)('Zazz')添加到mappers数组中,从而轻松地添加其他任何情况,比如"print表示小于10的数字“。

这根本行不通。它将根据放置在mappers数组中的位置而打印不同的内容,但是如果附加规则,它将返回1到5的内容:

代码语言:javascript
复制
Zazz
Zazz
FizzZazz
Zazz
BuzzZazz

所发生的是,你是避免了必须检查的mod 15的情况下,结合mod 3和国防部5的情况。这是好的,如果这是您需要担心的全部,但如果您打算在以后添加案例,最好是明确的事情,以便您可以在您以后的规则更加灵活。

这两个更改将将未修改的数字替换为“Zazz”:

代码语言:javascript
复制
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() || x
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/115743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档