在函数式编程术语中,您如何称呼带有 orElse 或其他后备方法的东西?
In functional programming terms, what do you call something with an orElse or other fallback method?
使用 scala 作为参考,我们在 PartialFunction
、Option
和 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,Applicative
是 Monad
的弱化,因为每个 Monad
都是 Applicative
但不是每个 Applicative
必然是Monad
。比如多维数组可以easily做成Applicative
但不能做成Monad
.
因此,总而言之,我相信您要查找的术语是 "applicative functor with alternative capabilities",由 Alternative
类型类编入 Haskell。如果你想听起来非常傲慢,我们可以用它在数学上严谨的名字来称呼它:一个由额外的幺半群结构支持的强松弛幺半群函子。但这只是我们炫耀的时候。
使用 scala 作为参考,我们在 PartialFunction
、Option
和 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,Applicative
是 Monad
的弱化,因为每个 Monad
都是 Applicative
但不是每个 Applicative
必然是Monad
。比如多维数组可以easily做成Applicative
但不能做成Monad
.
因此,总而言之,我相信您要查找的术语是 "applicative functor with alternative capabilities",由 Alternative
类型类编入 Haskell。如果你想听起来非常傲慢,我们可以用它在数学上严谨的名字来称呼它:一个由额外的幺半群结构支持的强松弛幺半群函子。但这只是我们炫耀的时候。