为无形hlist定义scalaz monad实例

时间:2013-09-21 23:06:29

标签: scala types monads scalaz shapeless

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

1 个答案:

答案 0 :(得分:0)

幺半群是一组符合特定法则的操作。您考虑哪些要素HListM[A]?如果您声明HListM[A] = HList,即任何HList,那么除了通过处理所有map之外,您很快就会发现f: A => B map identity作为Id你已经彻底改造了那些无趣的monad HListM[A] = A :: ... :: A :: HNil(还有一些额外但惰性的居民)。

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

但经过大量的工作,你最终会得到与List[A]同构的东西;为什么不在这种情况下使用{{1}}?