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