(Jak) jest możliwe do reprezentowania monady w Scala w sposób ogólny (jak Monad
typeclass w Haskell)? Czy w tym celu można w jakiś sposób zdefiniować trait Monad
?Monada cecha w Scala
Odpowiedz
można spróbować coś takiego:
trait Monad[+M[_]] {
def unit[A](a: A): M[A]
def bind[A, B](m: M[A])(f: A => M[B]): M[B]
}
// probably only works in Scala 2.8
implicit def monadicSyntax[M[_], A](m: M[A])(implicit tc: Monad[M]) = new {
private val bind = tc.bind(m) _
def map[B](f: A => B) = bind(f compose tc.unit)
def flatMap[B](f: A => M[B]) = bind(f)
}
implicit object MonadicOption extends Monad[Option] {
def unit[A](a: A) = Some(a)
def bind[A, B](opt: Option[A])(f: A => Option[B]) = opt flatMap f
}
Można by oczywiście zdefiniować podobne obiekty ukryte na każdej innej monady dusza zapragnie. W kategoriach Haskella można myśleć o Monad
, podobnie jak typeclass i MonadicOption
, jako konkretnej instancji klasy tego typu. Domyślna konwersja po prostu pokazuje, w jaki sposób można wykorzystać tę klasę do umożliwienia korzystania z Scala's for
- zrozumienia ze wszystkim, co jest zgodne z typograficzną czcionką Monad
.
Ogólnie rzecz biorąc, większość rzeczy w bibliotece standardowej Scala, które wdrażają flatMap
są monady. Scala nie definiuje ogólnej czcionki typowej Monad
(choć byłoby to bardzo przydatne). Zamiast tego opiera się na sztuczce składniowej parsera, aby umożliwić użycie dowolnego z nich, co pozwala na implementację odpowiednich metod. W szczególności, sposoby te są map
, flatMap
i filter
(lub foreach
i filter
dla formy koniecznym).
Możesz znaleźć interesujący projekt scalaz; ma wiele innych (funkcjonalnych) rzeczy, a także implementację monad.
Scala osiąga podobną moc do klas typu Haskell poprzez wykorzystanie parametrów ukrytych, szczególnie zobaczyć granice i granice kontekstu. Możesz zobaczyć takie rzeczy w użyciu, szczególnie na Scala 2.8, z cechami takimi jak Ordering
i Numeric
.
To powiedziawszy, należy spojrzeć na projekt Scalaz. Ma monady, funktory, strzały ... cały shebang.
Spójrz na http://www.scala-lang.org/api/current/index.html#scala.collection.generic.FilterMonadic. Przypadek klasa jest już wbudowana w języku i szeroko stosowane na całym kolekcyjce ...
http://www.codecommit.com/blog/ruby/monads-are-not-metaphors
Oto przydatne i dość długi artykuł o wzór Monad i jego realizacji w Scala przez Daniela, który napisał przyjętym odpowiedź na to pytanie.
(Dla tych, którzy potknie tej „starożytnego” kwestii poprzez mistyczne sposoby SITE-SEARCH Stackoverflow użytkownika).
- 1. Zagnieżdżona cecha w konstruktorze klasy w scala
- 2. Dlaczego cecha Scala może rozszerzać klasę?
- 3. mixin lub cecha w F #
- 4. Co to jest porównywalna cecha Scali?
- 5. Może "rodzaj" monada w pytonie
- 6. budować jedyna cecha/* gałęzie
- 7. Każda monada jest monoidalna?
- 8. TortoiseHg Kopiowanie Podobieństwo cecha
- 9. instancja Monofoniczna monada
- 10. Manipulowanie monada stos
- 11. Zrozumienie Scali: ważna cecha czy cukier syntaktyczny?
- 12. Wywołanie IO Monada wewnątrz strzałki
- 13. Cecha wydajności Ruby w odniesieniu do informatyki
- 14. Nazwane obiekty jako cecha w kategoryzacji tekstu?
- 15. OpenLayers style CSS cecha podręczne
- 16. Tłumaczenie z monada na aplikacyjny
- 17. Może monada w Pythonie z metodą łańcuchową
- 18. Aktualizacja zewnętrzną monady tylko w transformatorze monada
- 19. Monada operacyjna z tłumaczem w dowolnej monadzie
- 20. kłopoty ze zrozumieniem Monada (->)
- 21. scalaz walidacji i lista monada
- 22. Może monada wewnątrz stosu transformatorów
- 23. instancji Monada do binarnego drzewa
- 24. Jak widelec wewnątrz transformatora monada
- 25. Monada stanowa, dlaczego nie krotka?
- 26. tworzenie wartości monada przed cesją
- 27. Różnica między cecha dziedziczenia i rodzaju własnej adnotacji
- 28. Co więcej Scala idiomatyczne: cechę TraitA rozciąga TraitB lub cecha TraitA {self: TraitB =>}
- 29. automatyczna konwersja xml w Scala
- 30. Echarts - niestandardowa cecha zestawu narzędzi znak/komentarz
Dziękuję, to było dokładnie to, czego szukałem. Chciałem tylko ogólnie zdefiniować funkcje i transformatory monady ... – Dario
Nie użyjesz tego do niczego rzeczywistego, prawda? :-) Poważnie, pracowałem z Scalą przez chwilę i odkryłem, że wiele przypadków, w których Haskell użyłby czcionki Monad, nie pojawi się w Scali z powodu cech i podtypów. Podana powyżej typka, choć fajna, z pewnością nie byłaby idiomatycznym sposobem rozwiązywania problemów w Scali. –
Ale one pojawiają się. Pojawiają się cały czas. Kilka razy dziennie, chcę 'liftA2' lub' sequenceA'. To prawda, że wymagają one tylko Applicative, a nie Monad, ale jeśli nie pojawią się w twoim programowaniu, musisz napisać coś bardzo prostego. – Apocalisp