首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在空/未定义的情况下链接?

是否有可能在空/未定义的情况下链接?
EN

Stack Overflow用户
提问于 2020-10-16 15:24:50
回答 1查看 354关注 0票数 0

有一个给定的函数,它是固定的,不能更改:

代码语言:javascript
复制
const validate = v => v === "fred" ? "Y" : undefined

现在,由于我希望成为函数,并且希望避免空检查,所以我决定使用Maybe (ramda-fantasy)作为验证函数:

代码语言:javascript
复制
const vv = val => Maybe(val).map(v=> validate(v)).getOrElse("N")

如果vv"fred"一起调用,则应返回"fred",否则将返回N

  • vv(null)返回N -> OK
  • vv("fred")返回Y -> OK
  • vv("ding")返回undefined ->错误,预期的N

问题是,Maybe.map总是返回Just,我不明白(因为我只是在学习)。对我来说,如果这个函数的行为方式类似于返回Maybe(val) (返回NoneJust )的方式,我将是有益的。

我有两个问题:

  1. 为什么Maybe.map不处理空/未定义?
  2. 如何重写vv,使其在所有三种情况下都返回预期值?

编辑:我想解释为什么不应该更改验证:这只是来自外部库的函数的简单例子。我想看看将这些库集成到函数式编程中是多么容易/多么困难。因此,它不是关于字符串操作的,而是关于流值的,当它在某一点上计算为null时。

EDIT2:

这解决了我的问题:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-16 18:49:34

备注:兰达幻想是不再维护。团队建议您使用这些概念的其他实现。

但是我们仍然可以回答这个问题,因为任何合理的Maybe实现都可能是正确的

基本上,这不是设计用来工作的方式。这个想法是,你可以有一个公正的持有绝对任何价值。其中包括值nullundefined

Ramda添加了一个方便的构造函数Maybe (val),如果val不是零值,它将转换为Just (val),如果是,则转换为Nothing ()。但这并不意味着您不能创建一个Just (null)。主要施工技术是使用静态Maybe .of。你可以注意到

代码语言:javascript
复制
Maybe (null)    //=> Nothing ()
Maybe.of (null) //=> Just (null)

所以我们可能不会让这种技术发挥作用。我们不能仅仅在我们的map之上使用这样一个现有的validate,并且期望它能够工作。然而,我们可以使用这样的版本:

代码语言:javascript
复制
const validate = v => v === "fred" ? Just ("Y") : Nothing ()

在这里,我们还有一个问题。Maybe ('fred') .map (validate)产生Just (Just ('Y'))。我们有额外的筑巢。但这正是chain的作用所在。它删除了这样一个额外的级别,以便Maybe ('fred') .chain (validate)生成Just ('Y')。然后我们可以使用它像这样

代码语言:javascript
复制
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'
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64392058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档