作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我一直试图通过定义一个高阶仿函数(即 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/
我是一名优秀的程序员,十分优秀!