Мне было интересно, если scala Either
действительно является Monad
в категории Theory sense ?. Я знаю, что Monads должен иметь методы bind
и return
. Что такое Either
bind
?Is Scala Либо действительно Монада
ответ
Да, это действительно так - иначе это было бы в скалаз-вне закона. Either
«s bind
определяется что-то вроде:
trait Either[A, B] {
def bind[C](f: B => Either[A, C]) = this match {
case Right(b) => f(b)
case Left(a) => Left(a)
}
}
(на практике это определено через класс типов, но приведенное выше определение будет работать)
Я предполагаю, что правильнее было бы сказать, что при фиксированном A
, то тип ({type L[B]=Either[A, B]})#L
образует a Monad
, поэтому Either
- это более класс Monads
, чем Monad
в своем собственном праве, но это чрезвычайно техническое различие.
Но это действительно Monad
; он удовлетворяет всем монадам.
Итак, точнее сказать, что 'Right' и' Left' являются 'Monads', тогда как' Either' сам не является, а его подклассами? – goral
Нет, это неправильно. «Левый» сам по себе не является «Монадом» вообще, а «Право» сам по себе является только личностью «Монад». Если вы хотите быть точным, то «Монада» на самом деле не является чертой (которая, в конце концов, не является математической концепцией), как набор и пара операций. Таким образом, это больше похоже на «для любого' A', множество всех «Либо [A, B]» формирует монаду под операциями «bind = ...» и «point = ...»). – lmm
As of Scala 2.12, либо стало правым, так и технически. Либо в корне стало более единообразным с другими реализациями Monad (в этом не нужно было выбирать проекцию, из которой затем выполнялись операции Monad). – chaotic3quilibrium
http://scabl.blogspot.com/2013/02/monads-in-scala-1.html: * Операция привязки, как функция Scala, имела бы следующую подпись: * 'def bind [A , B] (Возможно, [A]) (A => Maybe [B]): Возможно [B] ' –
Я бы сказал, что Haskell' Maybe' в Scala больше похож на «Option», чем «Либо». «Либо» - это кооперация типов. – goral
Прочтите статью. Он обращается с этим. –