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