加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为无形hlist定义scalaz monad实例

发布时间:2020-12-16 18:28:09 所属栏目:安全 来源:网络整理
导读:我试图通过点和绑定实现为无形HList定义Monad( scalaz).第一个问题是HList trait不是类型构造函数,但是可以用类型lambdas解决,点很简单,但是我找不到正确的bind实现,我想我需要一些类型Poly1的函数和一些Aux / Mapper技巧,但那个无形的一面对我来说仍然是黑
我试图通过点和绑定实现为无形HList定义Monad( scalaz).第一个问题是HList trait不是类型构造函数,但是可以用类型lambdas解决,点很简单,但是我找不到正确的bind实现,我想我需要一些类型Poly1的函数和一些Aux / Mapper技巧,但那个无形的一面对我来说仍然是黑暗的. HList的所有函数都是Monad,就像简单的List一样,所以可以用 Scalaz实现一个吗?

解决方法

幺半群是一组符合特定法则的操作.您认为哪些元素可能是HListM [A]?如果你声明HListM [A] = HList,即任何HList,那么你很快就会发现你不能用f映射:A => B,除了将所有地图视为身份并且你重新创造了相当无趣的monad Id(带有一些额外但惰性的居民).

我们可以创建一个类型为HListM [A] = A :: … :: A :: HNil的monad(尽管甚至在Scala中实际表达该类型是一个挑战 – 你需要一个辅助特征特征CopiesOf [N&lt ;:Nat,A] {type Out&lt ;: HList},暗示提供这个的实例,然后是实际写它的存在主义(CopiesOf [N,A] #Out forSome {type N<:Nat})) .为此编写monad操作是可能的,尽管你需要在操作点需要像Prepend这样的无形辅助类,因为在Scala中没有真正的方法来表达“forall”类型 - 你可以为_0声明你的类型的实例和Succ [N],但没有办法向编译器证明任何N<:Nat都有一个实例,只要你需要使用它们就必须要求隐式实例. 但是经过大量的工作,你最终会得到与List [A]同构的东西;为什么不在这种情况下使用List [A]?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读