Ich habe versucht, eine Monad
(scalaz) für formlose HList
bis point
und bind
Implementierung zu definieren. Das erste Problem ist, dass HList
Trait ist kein Typ Konstruktor, aber das kann mit Typ Lambdas gelöst werden, point
ist einfach, aber ich konnte nicht richtige Implementierung für bind
finden, ich denke, ich brauche eine Funktion des Typs Poly1
mit einigen Aux/Mapper
Tricks , aber diese Seite des Formlosen ist mir noch dunkel. HList
hat alle Funktionen eine Monade, wie einfache Liste, also ist es möglich, eine von Scalaz zu implementieren?Definieren Sie scalaz Monad-Instanz für eine formlose hlist
Antwort
Ein Monoid ist ein Satz mit einigen Operationen, die bestimmten Gesetzen gehorchen. Welche Elemente betrachten Sie als möglich HListM[A]
? Wenn Sie HListM[A] = HList
erklären, das heißt jede HList
, dann werden Sie schnell feststellen, dass Sie nicht können map
mit f: A => B
, mit Ausnahme von allen map
s als identity
Behandlung und Sie haben die eher uninteressant Monade Id
(mit ein paar extra, aber inert Einwohner neu erfunden).
Wir könnten eine Monade mit der Art machen HListM[A] = A :: ... :: A :: HNil
(obwohl auch tatsächlich in Scala diese Art zum Ausdruck ist eine Herausforderung - Sie würden brauchen ein Hilfs Merkmal trait CopiesOf[N <: Nat, A] {type Out <: HList
}, implicit
s Beispiele dafür zu schaffen, und dann ein existentielle tatsächlich schreibe es (CopiesOf[N, A]#Out forSome {type N <: Nat}
)). Das Schreiben von Monad-Operationen ist möglich, obwohl Sie am Einsatzort formlose Hilfsklassen wie Prepend
benötigen, da es keine echte Möglichkeit gibt, einen "Forall" -Typ in Scala auszudrücken - Sie können Instanzen Ihres Typs für _0
deklarieren und Succ[N]
, aber es gibt keine Möglichkeit, dem Compiler zu beweisen, dass es eine Instanz für irgendeine N <: Nat
gibt, Sie müssen nur implizite benötigen, wann immer Sie sie brauchen.
Aber nach einer Menge Arbeit würden Sie mit etwas isomorph zu List[A]
enden; warum nicht einfach List[A]
für diesen Fall verwenden?
- 1. Definieren Sie eine Typklasse für formlose Datensätze
- 2. Wie formlose Fallklassen mit Attributen und Typklassen?
- 3. Karte für allgemeinen hList
- 4. "Moderne" HList?
- 5. Scalaz Validierung
- 6. Gemeinsame Einschränkung für die Einzelteile eines hList
- 7. Deriving hList von Nullen aus einer Art hList von Monoide
- 8. Reader Monad mit Scalaz
- 9. Wie ein hList auf einem anderen hList mit foldRight/foldLeft
- 10. Typklassen und Vererbung in Scalaz
- 11. Karte ein homogenes hList eines Typs in eine hetergenous hList verschiedenen Typen
- 12. Wie definieren Sie eine Funktion
- 13. Definieren Sie eine benutzerdefinierte Farbvariable
- 14. Beispiel für die Verwendung von Scalaz Monad
- 15. Shapeless hList Typ Überprüfung
- 16. HMAP von hList Typ
- 17. Was soll ich für Scalaz ‚Traverse Funktionalitäten
- 18. Scalaz-Typklassen für Apache Spark-RDDs
- 19. Beispiel für Open Source-Projekte mit scalaz
- 20. Erste Elemente aus einem hList
- 21. scalaz 7 Äquivalent von `<|*|>` von scalaz 6
- 22. So definieren Sie eine Spalte für Schaltflächen in FXML (JavaFX)
- 23. Können Sie eine Instanzmethode für Unterdokumente in Mongoose definieren?
- 24. Definieren Sie eine Variable für die Verwendung außerhalb des Bereichs
- 25. So definieren Sie eine Standard-Shell für Emacs
- 26. Wie definieren Sie einen Typ für eine Funktion in Scala?
- 27. So definieren Sie einen Alias für eine Eigenschaft
- 28. Umklappen HList mit unbekannten Typen
- 29. Scalaz Kleisli Frage
- 30. Analysiere Liste [String] in HList
Dies ist nicht im direkten Sinne möglich, aber es ist eine interessante Frage. Siehe zum Beispiel [meine Antwort hier] (http://stackoverflow.com/a/14456938/334519) (mit anwendungsbezogenen Funktoren anstelle von Monaden), [dieses verwandte Beispiel] (https://github.com/milessabin/shapeless/ blob/master/Beispiele/src/main/scala/shapeless/Beispiele/cartesianproduct.scala) in Shapeless, und meine (unbeantwortete) Frage [hier] (https://twitter.com/travisbrown/status/294064540235210752). –
ScalaZ ist immer noch Neuland für mich, aber dies könnte die Methoden und Interoperabilität enthalten, die Sie benötigen: [Shapeless Contrib] (https://github.com/typelevel/shapeless-contrib) – EECOLOR
mandubian (http://stackoverflow.com/ users/601296/mandubian) schrieb einen Blog-Eintrag über ein Monoid für HList: http://mandubian.com/2014/07/29/hmonoid/, das für Sie von Interesse sein kann. – al3xar