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

Используя 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 являются полугруппами для таких типов)?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

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

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

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

Итак, подводя итог, я считаю, что вам нужен термин «аппликативный функтор с альтернативными возможностями», кодифицированный в Haskell классом типов Alternative. Если вы хотите казаться ужасно высокомерным, мы можем назвать его его математически строгим названием: сильный слабый моноидальный функтор, поддерживаемый дополнительной моноидальной структурой. Но это только если мы хвастаемся.

0 голосов
/ 05 ноября 2018

Есть 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].

...