6

我正在阅读有关函数式编程的教程,该教程显示了使用 sanctuary.js 库的以下代码示例:

var S = require('sanctuary')
var Maybe = S.Maybe

S.add(
  Maybe.of(3)
  ,Maybe.of(5)
)
.map(n => n * n)

我得到错误Maybe.of is not a function。sanctuary.js API 文档显示了一个使用.ofas的示例S.of(S.Maybe, 42),所以我修改了我的代码,如下所示:

...
S.of(S.Maybe, 3)
,S.of(S.Maybe, 5)

我得到了错误:

add :: FiniteNumber -> FiniteNumber -> FiniteNumber
       ^^^^^^^^^^^^
            1

The value at position 1 is not a member of ‘FiniteNumber’.

我在 Sanctuary 网站上没有看到任何关于 FiniteNumber 类型类的文档。如何使此代码工作?有没有办法将 sanctuary.of构造函数链接到类型类上,所以教程网站上的示例有效?

4

2 回答 2

4

您不能添加两个 Maybe,您只能添加两个数字。请注意,您阅读的教程使用add = R.lift(R.add).

在避难所,你可以使用

S.lift2(S.add, S.Just(3), S.Just(5)) // Just(8)

或者

S.ap(S.map(S.add, S.Just(3)), S.Just(5)) // Just(8)
S.Just(3).map(S.add).ap(S.Just(5)) // Just(8)

或者

S.ap(S.ap(S.Just(S.add), S.Just(3)), S.Just(5)) // Just(8)
S.Just(S.add).ap(S.Just(3)).ap(S.Just(5)) // Just(8)
于 2017-11-26T22:38:44.420 回答
1

为了包装一些价值,Maybe你应该使用函数S.toMaybe代替Maybe.of

于 2017-11-27T14:22:42.963 回答