【发布时间】:2021-09-10 14:16:33
【问题描述】:
有一个给定的功能,它是固定的,不能改变:
const validate = v => v === "fred" ? "Y" : undefined
现在,因为我想使用功能并且想避免空检查,所以我决定使用Maybe (ramda-fantasy) 进行验证功能:
const vv = val => Maybe(val).map(v=> validate(v)).getOrElse("N")
如果用"fred" 调用vv,则应返回Y,否则返回N。
-
vv(null)返回N-> 好的 -
vv("fred")返回Y-> 好的 -
vv("ding")返回undefined-> 错误,应为N
问题是,Maybe.map 总是返回 Just,我不明白(因为我只是在学习它)。对我来说,如果此函数的行为方式与返回 None 或 Just 的 Maybe(val) 类似,我将受益匪浅。
我有两个问题:
- 为什么
Maybe.map不处理空/未定义? - 如何重写
vv使其在所有三种情况下都返回预期值?
编辑:我想解释一下为什么不应该更改 validate:它只是来自外部库的函数的简单示例。我想看看将这些库集成到函数式编程中的难易程度。所以不是关于字符串操作,只是关于在某些时候它评估为 null 时的流式值。
EDIT2:
这解决了我的问题:
Either.ofNullable = Either.prototype.ofNullable = function (value) {
return value == null ? Either.Left("is null") : Either.Right(value);
};
编辑3: 我已经实现了自己的 Either,但缺少功能:https://github.com/maciejmiklas/functional-ts/blob/main/src/either.ts
【问题讨论】: