scala - 为无形 hlist 定义 scalaz monad 实例

标签 scala types monads scalaz shapeless

我试图定义一个 Monad (scalaz) 无形 HList通过pointbind执行。第一个问题是 HList trait 不是类型构造函数,但可以使用 lambda 类型解决,point很简单,但我找不到 bind 的正确实现,我想我需要一些 Poly1 类型的函数与一些 Aux/Mapper诡计,但无形的那一面对我来说仍然是黑暗的。 HList所有的函数都是一个 Monad,比如简单的 List,所以可以从 Scalaz 实现一个吗?

最佳答案

幺半群是具有一些遵守特定规律的操作的集合。您在考虑哪些因素可能HListM[A] ?如果您声明 HListM[A] = HList ,即任何 HList ,那么你很快就会发现不能mapf: 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/

相关文章:

haskell - 说明 Category、Monoid 和 Monad 的简单例子?

Monad 和 SML 模块

scala - 如何在 Scala 中将字符串转换为整数列表?

scala - 避免在基本特征中初始化覆盖的 `val`?

c - 数据类型检查导致 C 中永无止境的循环

c++ - 在 C++ 中返回成员类

scala - 构建自动化 - sbt : Compile/Test against multiple dependencies

scala - 是否可以在 lichess.org 上保存派对分析

c# - 如何创建返回实现接口(interface)的类的类型的方法的通用接口(interface)?

haskell - 如何创建一个允许 IO 但不是 MonadIO 的 monad?