为无形状hlist定义scalaz monad实例

为无形状hlist定义scalaz monad实例,scala,types,monads,scalaz,shapeless,Scala,Types,Monads,Scalaz,Shapeless,我试图通过点和绑定实现为无形状的HList定义一个Monad(scalaz)。第一个问题是,HListtrait不是一个类型构造函数,但它可以用lambdas类型解决,point很简单,但我找不到bind的正确实现,我想我需要一些Poly1类型的函数和一些Aux/Mapper技巧,但对我来说,无形的一面仍然是黑暗的HList的所有函数都是单子,就像简单的列表一样,因此可以从Scalaz实现一个单子吗?单子是一个集合,其中包含一些遵循特定规则的操作。您正在考虑哪些因素可能HListM[A]?如果你

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

单子是一个集合,其中包含一些遵循特定规则的操作。您正在考虑哪些因素可能
HListM[A]
?如果你声明
HListM[A]=HList
,即任何
HList
,那么你很快就会发现你不能
map
使用
f:A=>B
,除非把所有
map
视为
identity
,并且你已经重新发明了相当乏味的monad
Id
(有一些额外但惰性的居民)


我们可以制作一个单子,其类型为
HListM[a]=a:::A::HNil
(尽管在Scala中实际表达该类型也是一个挑战-您需要一个辅助特征
特征副本[N从直观的意义上讲这是不可能的,但这是一个有趣的问题。请参见例如(涉及应用程序函子而非单子)、在“无形状”和“我的”(未回答)ScalaZ对我来说仍然是未知领域,但它可能包含您需要的方法和互操作性:mandubian()为HList:写了一篇关于幺半群的博文,您可能会感兴趣。