我试图定义一个 Monad
(scalaz) 无形 HList
通过point
和 bind
执行。第一个问题是 HList
trait 不是类型构造函数,但可以使用 lambda 类型解决,point
很简单,但我找不到 bind
的正确实现,我想我需要一些 Poly1
类型的函数与一些 Aux/Mapper
诡计,但无形的那一面对我来说仍然是黑暗的。 HList
所有的函数都是一个 Monad,比如简单的 List,所以可以从 Scalaz 实现一个吗?
最佳答案
幺半群是具有一些遵守特定规律的操作的集合。您在考虑哪些因素可能HListM[A]
?如果您声明 HListM[A] = HList
,即任何 HList
,那么你很快就会发现不能map
与 f: A => B
, 除了处理所有 map
s 为 identity
你重新发明了相当无趣的单子(monad)Id
(有一些额外但惰性的居民)。
我们可以创建一个类型为 HListM[A] = A :: ... :: A :: HNil
的 monad (尽管在 Scala 中实际表达该类型也是一个挑战——您需要一个辅助特征 trait CopiesOf[N <: Nat, A] {type Out <: HList
}、implicit
来提供这种情况的实例,然后是实际编写它的存在论( CopiesOf[N, A]#Out forSome {type N <: Nat}
))。可以为此编写 monad 操作,但您需要像 Prepend
这样的无形辅助类。在操作点,因为在 Scala 中没有真正的方法来表达“forall”类型 - 你可以为 _0
声明你的类型的实例和 Succ[N]
,但是没有办法向编译器证明有任何 N <: Nat
的实例,您只需要在需要使用它们时要求隐含的。
但是经过大量工作后,您最终会得到与 List[A]
同构的东西。 ;为什么不直接使用 List[A]
对于那种情况?
关于scala - 为无形 hlist 定义 scalaz monad 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18938596/