scala中的高阶函数
发布时间:2020-12-16 08:55:20 所属栏目:安全 来源:网络整理
导读:所以我一直试图通过定义一个更高阶的函子来将我的函子的直觉推到极限,即a,将一阶类型作为类型参数的F,以及函数并将一阶类型的函数提升到 scala中的这个更高的上下文喜欢 trait Functor1[F[_[_]] { def hmap[X[_],Y[_]] : (X ~ Y) = F[X] = F[Y]} 我一直试图
所以我一直试图通过定义一个更高阶的函子来将我的函子的直觉推到极限,即a,将一阶类型作为类型参数的F,以及函数并将一阶类型的函数提升到
scala中的这个更高的上下文喜欢
trait Functor1[F[_[_]] { def hmap[X[_],Y[_]] : (X ~> Y) => F[X] => F[Y] } 我一直试图定义普通仿函数的一些地图可导函数,例如 trait Functor[F[_]] { def map[A,B] : (A => B) => F[A] => F[B] // there's a few more besides this that are map derivable def distribute[A,B](fab: F[(A,B)]): (F[A],F[B]) } 但我不能写任何类型检查的东西…… 可以在scala中定义更高阶的仿函数吗?如果不是那么在哈斯克尔? 解决方法
不确定你的目标是什么,但是这个类型检查
import scala.language.higherKinds trait Functor1[F[G[_]]]{ def hmap[X[_],Y[_]]:(X ~> Y) => F[X] => F[Y] } case class FId[Z,F[_]](f:F[Z]) implicit def Functor1Id[Z] = new Functor1[({type L[G[_]]=FId[Z,G]})#L]{ def hmap[X[_],Y[_]]:(X ~> Y) => FId[Z,X] => FId[Z,Y]= ??? } (我添加了Z参数因为我想避免存在而我不得不使用“类型lambda”技巧) 你想为“仿函数的函子”定义一个地图吗? case class Comp[F[_],G[_],Z](unComp:F[G[Z]]) implicit def fcomp[F[_],G[_]](implicit ff:Functor[F],fg:Functor[G])=new Functor[({ type abs[A]=Comp[F,G,A]})#abs]{ def fmap[A,B](fga:Comp[F,A])(f: A => B):Comp[F,B]= Comp(ff.fmap(fga.unComp)(fg.fmap(_)(f))) } 我在scala-reggen年一直在玩弄玩具,但我认为我不是那么聪明,因为我主要是通过摸索(并检查Scalaz的灵感)来做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |