2013-09-21 15 views
5

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

+2

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

+0

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

+1

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

Odpowiedz

0

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?