gpt4 book ai didi

scala - scala 中的高阶仿函数

转载 作者:行者123 更新时间:2023-12-01 18:50:06 25 4
gpt4 key购买 nike

因此,我一直试图通过定义一个高阶仿函数(即 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 中定义更高阶仿函数吗?如果不是那么在 haskell 中?

最佳答案

不确定您的目标是什么,但此类型检查

  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 参数,因为我想避免存在,并且必须使用“type 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,G,A])(f: A => B):Comp[F,G,B]= Comp(ff.fmap(fga.unComp)(fg.fmap(_)(f)))
}

我一直在玩弄仿函数 scala-reggen但我不认为我是聪明的人,因为我主要是通过摸索(并检查 Scalaz 来获取灵感)来做到这一点

关于scala - scala 中的高阶仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23577437/

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