Próbowałem zdefiniować Monad
(scalaz) dla bezkształtnych implementacji HList
przez point
i bind
. Pierwszy problem polega na tym, że cecha HList
nie jest konstruktorem typu, ale można ją rozwiązać za pomocą typu lambdas, point
jest prosta, ale nie mogę znaleźć odpowiedniej implementacji dla bind
, chyba potrzebuję jakiejś funkcji typu Poly1
z pewnymi sztuczkami Aux/Mapper
, ale ta strona bezkształtnych wciąż jest dla mnie ciemna. HList
ma wszystkie funkcje Monady, jak prosta lista, więc czy możliwe jest zaimplementowanie jednego z Scalaz?Definiowanie instancji monady scalaz dla bezkształtnej hlista
Odpowiedz
Monofoniczny to zestaw niektórych operacji, które są zgodne z określonymi przepisami. Jakie elementy bierzesz pod uwagę jako możliwe HListM[A]
? Jeśli zadeklarujesz HListM[A] = HList
, czyli dowolnym HList
Pokochasz więc szybko okaże się, że nie można map
z f: A => B
, z wyjątkiem leczenia wszystkich map
s jako identity
a ty reinvented dość nieciekawą monady Id
(z kilkoma dodatkowymi ale obojętnych mieszkańców).
Mogliśmy zrobić monady z typem HListM[A] = A :: ... :: A :: HNil
(choć nawet faktycznie wyrażania tego typu w Scala jest wyzwaniem - należałoby pomocniczy cecha trait CopiesOf[N <: Nat, A] {type Out <: HList
} implicit
s, aby zapewnić wystąpień tego, a wtedy rzeczywiście egzystencjalnym napisz to (CopiesOf[N, A]#Out forSome {type N <: Nat}
)). W tym celu możliwe jest pisanie operacji na monadach, chociaż w danym momencie potrzebujesz wymagać bezkształtnych klas pomocniczych, takich jak Prepend
, ponieważ nie ma realnego sposobu na wyrażenie typu "forall" w Scali - możesz zadeklarować instancje swojego typu dla _0
i Succ[N]
, ale nie ma sposobu, aby udowodnić kompilatorowi, że istnieje instancja dla dowolnego N <: Nat
, po prostu trzeba wymagać niejawnych, gdy trzeba z nich korzystać.
Ale po wielu pracach skończyłbyś z czymś izomorficznym do List[A]
; dlaczego nie użyć po prostu List[A]
dla tej sprawy?
- 1. Przemiany państwa z bezkształtnej monady State
- 2. Klasy typu Scalaz dla Apache Spark RDD
- 3. typ transformacji z bezkształtnej
- 4. instancja MonadTransControl dla niestandardowego monady
- 5. Definiowanie DataTrigger dla StackPanel
- 6. Czy mogę wyeliminować użycie UndecidableInstances w tej instancji Show dla darmowej monady?
- 7. Monady VS aplikacyjnych funktory dla kontraktów
- 8. Pisanie wydajnej pętli iteracyjnej dla monady ST
- 9. Scalaz odpowiednik forM_
- 10. Definiowanie progu skalowania dla ról internetowych Azure
- 11. Definiowanie Typeclass for Shapeless Records
- 12. Scalaz Bind [Seq] typeclass
- 13. Definiowanie aliasu dla klasy Razor
- 14. Definiowanie prototypu tylko dla obiektów {...}
- 15. Definiowanie polityki bezpieczeństwa dla systemu
- 16. składnia deklaracji monady ST
- 17. Tworzenie monady analogiczny do IO Monady ze stanu przykuty
- 18. Aplikacja instancji dla krotki z monoidem i funkcją wewnątrz
- 19. Jak korzystać Scalaz 7 za EitherT z liftM
- 20. Rozpakowywanie monady stanu Haskell
- 21. i IO Monady
- 22. lista transformatora monady
- 23. Strumienie kontra monady
- 24. Wizualizacja wolnej monady
- 25. StackOverflow w kontynuacji monady
- 26. nie rozumiem funkcja scalaz Endo
- 27. scalaz walidacji i lista monada
- 28. Komponowanie Monady v aplikacyjnych Funktory
- 29. Definiowanie dekoratorów Pythona dla pełnego modułu
- 30. Definiowanie symboli preprocesora dla analizatora Clion
Nie jest to możliwe w prostym znaczeniu, ale jest to interesujące pytanie. Zobacz na przykład [moja odpowiedź tutaj] (http://stackoverflow.com/a/14456938/334519) (dotyczy funktorów aplikacyjnych zamiast monad), [ten powiązany przykład] (https://github.com/milessabin/shapeless/ blob/master/examples/src/main/scala/shapeless/examples/cartesianproduct.scala) w Shapeless i moim (bez odpowiedzi) pytaniu [tutaj] (https://twitter.com/travisbrown/status/294064540235210752). –
ScalaZ jest dla mnie nadal niezbadanym obszarem, ale może zawierać metody i współdziałanie, których potrzebujesz: [Shapeless Contrib] (https://github.com/typelevel/shapeless-contrib) – EECOLOR
mandubian (http://stackoverflow.com/ users/601296/mandubian) napisał post na blogu o monoidzie dla HList: http://mandubian.com/2014/07/29/hmonoid/, który może Cię zainteresować. – al3xar