幺半群是一些遵循特定定律的运算的集合。您认为哪些元素是可能的HListM[A]
?如果你声明HListM[A] = HList
, 即 any HList
,那么你很快就会发现你不能map
使用,除非将所有sf: A => B
视为并且你重新发明了相当无趣的单子(有一些额外但惰性的居民)。map
identity
Id
我们可以用该类型创建一个 monad HListM[A] = A :: ... :: A :: HNil
(尽管在 Scala 中实际表达该类型也是一个挑战 - 您需要一个辅助特征trait CopiesOf[N <: Nat, A] {type Out <: HList
}, implicit
s 来提供该类型的实例,然后需要一个存在性来实际编写它 ( CopiesOf[N, A]#Out forSome {type N <: Nat}
))。为此编写 monad 操作是可能的,尽管您需要像Prepend
在操作时一样需要无形的辅助类,因为在 Scala 中没有真正的方法来表达“forall”类型 - 您可以为_0
and声明类型的实例Succ[N]
,但是没有办法向编译器证明存在任何实例N <: Nat
,您只需要在需要使用它们时就需要隐式实例。
但经过大量工作后,您最终会得到与 ; 同构的东西List[A]
。为什么不只用于List[A]
这种情况呢?