Scala 在函数式编程术语中,使用orElse或其他回退方法,您将其称为什么?

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

使用scala作为参考,我们可以在多个地方看到回退行为(
orElse
),例如
PartialFunction
Option
、以及cats
EitherOps

这种感觉与单子的扁平化行为相似,但不同。对于表现出这种行为的事物,有没有函数式编程术语

编辑: 到目前为止,我发现了一些很好的答案,在猫身上挖掘了更多

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)
因此,我现在看到scalaz
Alt
和haskell
Alternative
与CAT
Alternative
并不完全相同。更有趣的是(根据cats文档,在scalaz中称为
Plus

因此,我们可以说这种行为是由一种类型表现出来的吗?对于这种类型,如果没有一个半群作为其内部类型,就不能定义半群(因为这样我们可以说scalaz
Alt
和haskell
Alternative
都是这种类型的半群)

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聚合操作符”的东西