2013-09-21 15 views
5

シェイプレスHListからpointbindの実装では、Monad(scalaz)を定義しようとしました。最初の問題は、HListの特性は型コンストラクタではありませんが、タイプlambdasで解くことができます。pointはシンプルですが、bindの正しい実装が見つかりませんでした。何らかの型の関数が必要ですねAux/Mapperトリック、形のない側はまだ私には暗いです。 HListは、単純なリストのようにMonadとなるすべての機能を持っているので、Scalazから実装することは可能ですか?シェイプレスなhlistのscalazモナドのインスタンスを定義する

+2

これは簡単な意味では不可能ですが、興味深い質問です。例えば[私の答えはこちら](http://stackoverflow.com/a/14456938/334519)(モナドの代わりに応用ファンクタを含む)、[この関連例](https://github.com/milessabin/shapeless/) Shapelessと私の(答えられていない)質問[ここ](https://twitter.com/travisbrown/status/294064540235210752)の中では、 –

+0

ScalaZはまだ私にとって未知の領域ですが、これには必要なメソッドと相互運用性が含まれている可能性があります:[Shapeless Contrib](https://github.com/typelevel/shapeless-contrib) – EECOLOR

+1

mandubian(http://stackoverflow.com/ users/601296/mandubian)は、HList用のmonoidについてのブログ記事を書いています:http://mandubian.com/2014/07/29/hmonoid/、興味深いものです。 – al3xar

答えて

0

モノイドは、特定の法律に従ういくつかの操作を含むセットです。可能な限りどの要素を検討していますかHListM[A]?あなたがHListM[A] = HList、すなわち任意のHListを宣言した場合は、identityとして、すべてのmap Sを処理することにより除き、f: A => Bと、あなたがすることができませんmapすばやく見つけると、あなたはいくつかの余分が、不活性住民とかなりつまらないモナドIdを(再発明しました)。

私たちも、実際にはScalaでその型を表現することは難題ですが、タイプHListM[A] = A :: ... :: A :: HNil(とモナドを作ることができる - 実際にあなたは}補助トレイトtrait CopiesOf[N <: Nat, A] {type Out <: HListを必要とするだろう。こののインスタンスを提供するために、implicit Sを、とまで続い実存それを書いてください(CopiesOf[N, A]#Out forSome {type N <: Nat}))。これに対してモナド演算を書くことは可能ですが、操作の時点でPrependのような形状のない補助クラスを必要とする必要がありますが、スカラで "forall"型を表現する実際の方法はないので - _0およびSucc[N]がありますが、N <: Natのインスタンスがあることをコンパイラーに証明する方法はありません。使用する必要があるときは、暗黙のものを要求するだけです。

しかし、多くの作業の後に、List[A]と同形のものになります。その場合はList[A]を使用しないのはなぜですか?

関連する問題