2013-09-21 16 views
5

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

+2

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). –

+0

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

+1

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

Antwort

0

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?

Verwandte Themen