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

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的灵感)来做到这一点.

(编辑:李大同)

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

    推荐文章
      热点阅读