【问题标题】:Define scalaz monad instance for a shapeless hlist为无形 hlist 定义 scalaz monad 实例
【发布时间】:2013-09-27 03:07:27
【问题描述】:

我尝试为无形的HListpointbind 实现定义一个Monad (scalaz)。第一个问题是HList trait 不是类型构造函数,但这可以用 lambdas 类型解决,point 很简单,但我找不到bind 的正确实现,我想我需要一些函数输入Poly1 和一些Aux/Mapper 技巧,但无形的那一面对我来说仍然是黑暗的。 HList 的所有函数都是 Monad,比如简单的 List,那么可以从 Scalaz 中实现一个吗?

【问题讨论】:

标签: scala types monads scalaz shapeless


【解决方案1】:

幺半群是具有一些遵守特定规律的操作的集合。 HListM[A],您正在考虑哪些元素?如果您声明HListM[A] = HList,即任何HList,那么您很快就会发现您不能将mapf: A => B 一起使用,除非将所有maps 视为identity,并且您已经重新发明了相当无趣的 monad Id(有一些额外但惰性的居民)。

我们可以创建一个类型为 HListM[A] = A :: ... :: A :: HNil 的 monad(尽管实际上在 Scala 中表达该类型也是一个挑战——你需要一个辅助 trait trait CopiesOf[N <: Nat, A] {type Out <: HList}、implicits 来提供这样的实例,并且然后是实际编写它的存在主义(CopiesOf[N, A]#Out forSome {type N <: Nat}))。可以为此编写 monad 操作,尽管您需要在操作时需要像 Prepend 这样的无形辅助类,因为在 Scala 中没有真正的方法来表达“forall”类型 - 您可以声明您的类型的实例对于_0Succ[N],但无法向编译器证明任何N <: Nat 都有一个实例,您只需要在需要使用它们时要求隐式实例即可。

但经过大量工作后,您最终会得到与List[A] 同构的东西;为什么不直接使用List[A] 呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多