В терминах функционального программирования, что вы называете чем-то с помощью orElse или другого резервного метода?

Используя scala для справки, мы видим запасное поведение (orElse) в нескольких местах, таких как PartialFunction, Option и кошек 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 в скалазе по документации котов).
Таким образом, мы можем сказать, что это поведение демонстрируется типом, для которого нельзя определить полугруппу, не имея также полугруппы для ее внутреннего типа (потому что тогда мы можем сказать скаляр Alt и Haskell Alternative такое полугруппы для таких видов)?

2 ответа

Решение

Приличный кусок Scala вдохновлен похожими концепциями в Haskell. В этом конкретном случае orElse довольно близко к "альтернативному" оператору <|> в Alternative класс типов.

В Хаскеле Applicative это Functor (читай: он содержит вещи и имеет некоторый способ взаимодействия с этими вещами), который имеет какой-то осмысленный моноидальный способ "объединения" этих вещей: <*>, Мы можем думать о <*> как что-то похожее (хотя и не идентичное) на Scala andThen тем, что требуется два "успешных" вычисления и их последовательность. По этой аналогии, Alternative является Applicative что дает возможность "восстановиться" после сбоя, поэтому <|> более или менее Скала orElse,

Так как вы упомянули монады, Applicative это ослабление Monad в том смысле, что каждый Monad является Applicative но не каждый Applicative обязательно Monad, Например, многомерные массивы можно легко превратить в Applicative но не может быть сделано Monad,

Итак, подводя итог, я считаю, что термин, который вы ищете, - это "аппликативный функтор с альтернативными возможностями", кодифицированный в 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],

Другие вопросы по тегам