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