Используя scala для справки, мы видим откат (orElse
) в нескольких местах, таких как PartialFunction
, Option
, и cats EitherOps
.
Это похоже на, но не то же самое, что и поведение монады на сплющивание. Существует ли функциональный термин программирования для вещей, которые демонстрируют такое поведение?
Edit:
Некоторые хорошие ответы до сих пор, копаясь в кошках, я нашел
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)
Итак, теперь я вижу, что скалаз Alt
и haskell Alternative
не совсем совпадают с кошками Alternative
. Более интересной вещью является SemigroupK
(называемый Plus
в скаляре согласно документации кошек).
Итак, можем ли мы сказать, что это поведение демонстрируется типом, для которого нельзя определить полугруппу, не имея также полугруппы для ее внутреннего типа (потому что тогда мы можем сказать, что scalaz Alt
и haskell Alternative
являются полугруппами для таких типов)?