有一个给定的函数,它是固定的,不能更改:
const validate = v => v === "fred" ? "Y" : undefined现在,由于我希望成为函数,并且希望避免空检查,所以我决定使用Maybe (ramda-fantasy)作为验证函数:
const vv = val => Maybe(val).map(v=> validate(v)).getOrElse("N")如果vv与"fred"一起调用,则应返回"fred",否则将返回N。
vv(null)返回N -> OKvv("fred")返回Y -> OKvv("ding")返回undefined ->错误,预期的N问题是,Maybe.map总是返回Just,我不明白(因为我只是在学习)。对我来说,如果这个函数的行为方式类似于返回Maybe(val) (返回None或Just )的方式,我将是有益的。
我有两个问题:
Maybe.map不处理空/未定义?vv,使其在所有三种情况下都返回预期值?编辑:我想解释为什么不应该更改验证:这只是来自外部库的函数的简单例子。我想看看将这些库集成到函数式编程中是多么容易/多么困难。因此,它不是关于字符串操作的,而是关于流值的,当它在某一点上计算为null时。
EDIT2:
这解决了我的问题:
Either.ofNullable = Either.prototype.ofNullable = function (value) {
return value == null ? Either.Left("is null") : Either.Right(value);
};EDIT3:我用缺少的功能实现了自己的功能:https://github.com/maciejmiklas/functional-ts/blob/main/src/either.ts
发布于 2020-10-16 18:49:34
备注:兰达幻想是不再维护。团队建议您使用这些概念的其他实现。
但是我们仍然可以回答这个问题,因为任何合理的Maybe实现都可能是正确的
基本上,这不是设计用来工作的方式。这个想法是,你可以有一个公正的持有绝对任何价值。其中包括值null和undefined。
Ramda添加了一个方便的构造函数Maybe (val),如果val不是零值,它将转换为Just (val),如果是,则转换为Nothing ()。但这并不意味着您不能创建一个Just (null)。主要施工技术是使用静态Maybe .of。你可以注意到
Maybe (null) //=> Nothing ()
Maybe.of (null) //=> Just (null)所以我们可能不会让这种技术发挥作用。我们不能仅仅在我们的map之上使用这样一个现有的validate,并且期望它能够工作。然而,我们可以使用这样的版本:
const validate = v => v === "fred" ? Just ("Y") : Nothing ()在这里,我们还有一个问题。Maybe ('fred') .map (validate)产生Just (Just ('Y'))。我们有额外的筑巢。但这正是chain的作用所在。它删除了这样一个额外的级别,以便Maybe ('fred') .chain (validate)生成Just ('Y')。然后我们可以使用它像这样
const validate = v => v === "fred" ? Just ("Y") : Nothing ()
const vv = val => Maybe (val) .chain (validate) .getOrElse ('N')
console .log ([
vv (null), // 'N'
vv ('fred'), // 'Y'
vv ('ding') // 'N'
])https://stackoverflow.com/questions/64392058
复制相似问题