Scala 在函数式编程术语中,使用orElse或其他回退方法,您将其称为什么?
使用scala作为参考,我们可以在多个地方看到回退行为(Scala 在函数式编程术语中,使用orElse或其他回退方法,您将其称为什么?,scala,functional-programming,scala-cats,partialfunction,Scala,Functional Programming,Scala Cats,Partialfunction,使用scala作为参考,我们可以在多个地方看到回退行为(orElse),例如PartialFunction、Option、以及catsEitherOps 这种感觉与单子的扁平化行为相似,但不同。对于表现出这种行为的事物,有没有函数式编程术语 编辑: 到目前为止,我发现了一些很好的答案,在猫身上挖掘了更多 Semigroup[Option[String]].combine(None, Some("b")) res0: Option[String] = Some(b) Semigroup[Opti
orElse
),例如PartialFunction
、Option
、以及catsEitherOps
这种感觉与单子的扁平化行为相似,但不同。对于表现出这种行为的事物,有没有函数式编程术语
编辑:
到目前为止,我发现了一些很好的答案,在猫身上挖掘了更多
Semigroup[Option[String]].combine(None, Some("b"))
res0: Option[String] = Some(b)
Semigroup[Option[String]].combine(Some("a"), Some("b"))
res1: Option[String] = Some(ab)
SemigroupK[Option].combineK(None, Some("b"))
res2: Option[String] = Some(b)
SemigroupK[Option].combineK(Some("a"), Some("b"))
res3: Option[String] = Some(a)
SemigroupK[List].combineK(List("a"), List("b"))
res4: List[String] = List(a, b)
Alternative[List].unite(List(None, Some("a"), Some("b")))
res4: List[String] = List(a, b)
因此,我现在看到scalazAlt
和haskellAlternative
与CATAlternative
并不完全相同。更有趣的是(根据cats文档,在scalaz中称为Plus
)
因此,我们可以说这种行为是由一种类型表现出来的吗?对于这种类型,如果没有一个半群作为其内部类型,就不能定义半群(因为这样我们可以说scalaz
Alt
和haskellAlternative
都是这种类型的半群)有Alt
:
基本上,orElse
变为alt
:
def alt[A](a1:=>F[A],a2:=>F[A]):F[A]
Scala的一大块灵感来自Haskell的类似概念。在这种特殊情况下,orElse
非常接近typeclass中的“alternative”操作符
在Haskell中,应用程序
是一个函子
(读:它包含一些东西,并且有一些与这些东西交互的方式),它有一些有意义的“组合”这些东西的单向方式:
。我们可以认为
与Scala的和有些相似(尽管不完全相同),因为它需要两次“成功”的计算并对它们排序。在这种类比下,替代方案
是一种提供从故障中“恢复”的方法的应用程序
,因此
或多或少是Scala的或Else
既然您提到了Monad,Applicative
是Monad
的弱化,从这个意义上讲,每个Monad
都是应用的
,但不是每个Applicative
都必然是Monad
。例如,多维数组可以做成Applicative
,但不能做成Monad
因此,总而言之,我相信您要寻找的术语是“具有替代功能的应用函子”,由alternative
typeclass在Haskell中编码。如果你想听起来非常傲慢,我们可以用它数学上严格的名字来称呼它:一个由一个附加的幺半体结构支持的强松弛幺半体函子。但这只是我们在炫耀。不是“函数式编程”,而是想到了“联合”——尽管它通常表现为更具体的情况(例如,域中包含null),如?
或联合(…)
。有人可能会用Y组合子来回答..>_@用户2864740这是一个很好的观点,也许我们正在寻找类似“monad聚合操作符”的东西