为无形hlist定义scalaz monad实例

5 monads types scala scalaz shapeless

我试图Monad为无形HList通过pointbind实现定义一个(scalaz).第一个问题是HListtrait不是一个类型构造函数,但是可以用类型lambdas解决,point很简单,但我找不到正确的实现bind,我想我需要一些Poly1带有一些Aux/Mapper技巧的类型函数,但是那个方面对我来说,无形的仍然是黑暗的.HList所有函数都是Monad,就像简单的List一样,所以可以用Scalaz实现一个吗?

lmm*_*lmm 0

幺半群是一些遵循特定定律的运算的集合。您认为哪些元素是可能的HListM[A]?如果你声明HListM[A] = HList, 即 any HList,那么你很快就会发现你不能map使用,除非将所有sf: A => B视为并且你重新发明了相当无趣的单子(有一些额外但惰性的居民)。mapidentityId

我们可以用该类型创建一个 monad HListM[A] = A :: ... :: A :: HNil(尽管在 Scala 中实际表达该类型也是一个挑战 - 您需要一个辅助特征trait CopiesOf[N <: Nat, A] {type Out <: HList}, implicits 来提供该类型的实例,然后需要一个存在性来实际编写它 ( CopiesOf[N, A]#Out forSome {type N <: Nat}))。为此编写 monad 操作是可能的,尽管您需要像Prepend在操作时一样需要无形的辅助类,因为在 Scala 中没有真正的方法来表达“forall”类型 - 您可以为_0and声明类型的实例Succ[N],但是没有办法向编译器证明存在任何实例N <: Nat,您只需要在需要使用它们时就需要隐式实例。

但经过大量工作后,您最终会得到与 ; 同构的东西List[A]。为什么不只用于List[A]这种情况呢?