【发布时间】:2018-11-03 20:38:15
【问题描述】:
阅读Frisbys guide to functional programming,目前在关于Maybe的章节。在appendix 书中建议使用folktale 或fantasyland。
但是,在这两个库中,Maybe 似乎不像书中描述的那样工作。
const Maybe = require('folktale/maybe')
// const Maybe = require('fantasy-options')
const {
flip, concat, toUpper, path, pathOr, match, prop
} = require('ramda')
console.log(
Maybe.of('Malkovich Malkovich').map(match(/a/ig))
)
// Just(['a', 'a'])
Maybe.of(null).map(match(/a/ig))
//******************************
// TypeError: Cannot read property 'match' of null
//******************************
// Nothing
Maybe.of(
{ name: 'Boris' }
).map(prop('age')).map(add(10))
// Nothing
Maybe.of(
{ name: 'Dinah', age: 14 }
).map(prop('age')).map(add(10))
// Just(24)
在从书中复制的这个示例中,第一个语句可以正常工作,但第二个语句得到一个TypeError。这似乎完全违背了Maybe 的目的。还是我误会了什么?
【问题讨论】:
-
Maybe.of总是构造一个Maybe。也许看看Maybe.fromNullable,它根据输入构造Maybe或Nothing -
Maybe无法在语言级别替换null。但是,Maybe与null具有相似的作用,因此您可以在应用程序级别替换它。null包裹在Maybe中仍然是null并且会导致提升函数的类型错误。 -
@ftor 是的,但是如果 .map fn 的值为空,难道不应该跳过运行它吗?
map(fn) { return this.isNothing ? this : Maybe.of(fn(this.$value)); }我以为这就是Maybe的全部目的 -
你可以为
null构造一个具有特定行为的类型。但是你会失去这种类型的参数多态性。不过,我没有足够的经验来评估后果。为null破例或许还不错。无论如何,看看参数化。 -
@BillJohnston
Maybe的全部意义在于为null提供更优雅的替代,而不是null值的包装。识别null并将它们变成Nothings 不是Maybe的工作。 Frisby 的书使用(有点老套)的方法将包含null的Maybe视为Nothing,但我认为这不是典型的,这几乎是一个实现细节。在 Folktale 中,创建Nothing的方法是使用Maybe.Nothing(),但Folktale 还提供了Maybe.fromNullable(上面已经提到),它将null和undefined转换为Nothing。
标签: javascript functional-programming monads fantasyland folktale