加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么Scalas不是monad?

发布时间:2020-12-16 18:43:40 所属栏目:安全 来源:网络整理
导读:我有兴趣知道 scala的设计决定.要么不是作为monad完成的.已经存在一些关于如何正确偏置的讨论,例如: right-biasing Either fixing Either Fixing scala.Either – unbiased vs biased 但是提到了太多的细节,我无法完整地了解为什么要这样做.有人可以概述一
我有兴趣知道 scala的设计决定.要么不是作为monad完成的.已经存在一些关于如何正确偏置的讨论,例如:

> right-biasing Either
> fixing Either
> Fixing scala.Either – unbiased vs biased

但是提到了太多的细节,我无法完整地了解为什么要这样做.有人可以概述一个有正确偏见的好处,关于这样做的问题以及没有正确偏见的Either(如果它们甚至存在)的好处?

解决方法

我认为它只是归结为 Principle of Least Astonishment.使用Either编码成功或失败显然是人们所做的事情,但它不是Either的唯一用途.事实上,除了传统之外,没有太多理由让正确的成功和左派失败.正如上面提到的adelbertc的评论所提到的,scalaz具有专门编码的验证.

为了进一步证明上述POLA声明的合理性,请使用以下代码:

def foo(): Either[Int,Int] = Right(1)
def bar(j: Int): Either[Int,Int] = Left(1)
def baz(z: Int): Either[Int,Int] = Right(3)

// Result is Left(1) 
for (a <- foo().right; b <- bar(a).right; c <- baz(b).right) yield c

编译因为我在for表达式中使用.right投影.在这里,条形图中的左(1)是失败的情况是有意义的,因此这就是结果,但想象一下,如果这两个是偏右的.上面的代码将在没有表达式中的.right投影的情况下进行编译,如:

for (a <- foo(); b <- bar(a); c <- baz(b)) yield c

如果你在代码中使用Either只是一个“一个或另一个”类型,你会惊讶于(1)这会编译和(2)它返回Left(1)并且看似永远不会执行巴兹.

总之,如果要使用Either编码成功或失败,请使用验证.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读