在函数式编程术语中,您如何称呼带有 orElse 或其他后备方法的东西?

In functional programming terms, what do you call something with an orElse or other fallback method?

使用 scala 作为参考,我们在 PartialFunctionOption 和 cats EitherOps.[=23 等几个地方看到了回退行为 (orElse) =]

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

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

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 与猫 Alternative 不太一样。更有趣的是 SemigroupK(根据 cats 文档,在 scalaz 中称为 Plus)。
那么我们是否可以说这种行为是由一种类型表现出来的,如果没有为其内部类型定义一个半群(因为那样我们可能会说 scalaz Alt 和 haskell Alternative 是此类的半群)?

Alt:

https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/Alt.scala

基本上,orElse 变成 alt:

def alt[A](a1: =>F[A], a2: =>F[A]): F[A].

相当一部分 Scala 的灵感来自 Haskell 中的类似概念。在这种特殊情况下,orElse 非常接近 Alternative 类型类中的 "alternative" 运算符 <|>

在 Haskell 中,一个 Applicative 是一个 Functor(阅读:它包含一些东西并且有一些与这些东西交互的方式)它有一些有意义的幺半群方式 "combining"那些东西:<*>。我们可以认为 <*> 与 Scala 的 andThen 有点相似(尽管不完全相同),因为它需要两次 "successful" 计算并对它们进行排序。在这个类比下,Alternative 是一个 Applicative,它提供了一种从失败中 "recover" 的方法,所以 <|> 或多或少是 Scala 的 orElse.

既然你提到了 monad,ApplicativeMonad 的弱化,因为每个 Monad 都是 Applicative 但不是每个 Applicative必然是Monad。比如多维数组可以easily做成Applicative但不能做成Monad.

因此,总而言之,我相信您要查找的术语是 "applicative functor with alternative capabilities",由 Alternative 类型类编入 Haskell。如果你想听起来非常傲慢,我们可以用它在数学上严谨的名字来称呼它:一个由额外的幺半群结构支持的强松弛幺半群函子。但这只是我们炫耀的时候。