在函数式编程术语中,使用 orElse 或其他后备方法的东西怎么称呼?

kag*_*ag0 6 functional-programming scala partialfunction scala-cats

以 scala 为参考,我们在几个地方看到了后备行为 ( orElse),例如PartialFunctionOption和 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)
Run Code Online (Sandbox Code Playgroud)

所以我现在发现 scalazAlt和 haskellAlternative与 cats 不太一样Alternative。更有趣的是(根据 cats 文档在 scalaz 中SemigroupK调用)。 那么我们是否可以说这种行为是由一种类型表现出来的,如果没有其内部类型的半群,则无法为其定义半群(因为这样我们可能会说 scalaz和 haskell是此类的半群)?Plus
AltAlternative

Sil*_*olo 3

Scala 的很大一部分受到 Haskell 中类似概念的启发。在这种特殊情况下,orElse非常接近类型类<|>中的“替代”运算符Alternative

在 Haskell 中, anApplicative是一个Functor(读:它包含事物并且有某种与这些事物交互的方式),它有一些有意义的幺半群方式来“组合”这些事物:<*>。我们可以认为<*>它与 Scala 有点相似(尽管不完全相同)andThen,因为它需要两次“成功”计算并对它们进行排序。在这个类比下, anAlternativeApplicative提供一种从失败中“恢复”的方法的 an ,<|>Scala 的 或多或少也是如此orElse

既然你提到了单子,Applicative是 的弱化Monad,从某种意义上说,每个Monad都是一个Applicative,但不是每个Applicative都是必然Monad。例如,多维数组可以很容易地制成Applicative,但不能制成Monad

因此,总而言之,我相信您正在寻找的术语是“具有替代功能的应用函子”,由Alternative类型类在 Haskell 中进行编码。如果你想听起来非常傲慢,我们可以用其数学上严格的名称来称呼它:由附加幺半群结构支持的强松散幺半群函子。但这只是我们炫耀的时候。