gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:52:06 26 4
gpt4 key购买 nike

我试图定义一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com