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

scala – 在continuation中推断结果类型

发布时间:2020-12-16 08:52:39 所属栏目:安全 来源:网络整理
导读:是否可以从以下代码中删除某些类型: import util.continuations._object TrackingTest extends App { implicit def trackable(x: Int) = new { def tracked[R] = shift { cf: (Int = (R,Set[Int])) = cf(x) match { case (r,ints) = (r,ints + x) } } } def
是否可以从以下代码中删除某些类型:

import util.continuations._

object TrackingTest extends App {

  implicit def trackable(x: Int) = new {
    def tracked[R] = shift { cf: (Int => (R,Set[Int])) =>
      cf(x) match {
        case (r,ints) => (r,ints + x)
      }
    }
  }


  def track[R](body: => R @cpsParam[(R,Set[Int]),(R,Set[Int])]) = reset {
    (body,Set[Int]())
  }

  val result = track(7.tracked[Int] + 35.tracked[Int])
  assert(result == (42,Set(7,35)))

  val differentTypes = track(9.tracked[String].toString)
  assert(differentTypes == ("9",Set(9)))
}

跟踪功能跟踪Int实例上跟踪的调用(例如7.tracked).

是否可以在跟踪的隐式上推断类型参数,因此以下内容将编译:

track(7.tracked + 35.tracked)

解决方法

你的问题让我想到了延续如何跟踪状态.所以我根据你的情况调整了这个并提出了这个问题:

import util.continuations._

object TrackingTest extends App {

  type State = Set[Int]
  type ST = State => State

  implicit class Tracked(val i: Int) extends AnyVal { 
    def tracked = shift{ (k: Int=>ST) => (state:State) => k(i)(state + i) }
  }

  def track[A](thunk: => A@cps[ST]): (A,State) = {
    var result: A = null.asInstanceOf[A]
    val finalSate = (reset {
      result = thunk
      (state:State) => state
    }).apply(Set[Int]())
    (result,finalSate)
  }

  val result = track(7.tracked + 35.tracked)
  assert(result == (42,35)))

  val differentTypes = track(9.tracked.toString)
  assert(differentTypes == ("9",Set(9)))
}

这是使用2.10.1,但它适用于2.9.1,只要你用以下内容替换2.10.x隐式值类:

implicit def tracked(i: Int) = new {
  def tracked = shift{ (k: Int=>ST) => (state:State) => k(i)(state + i) }
}

我做的关键改变是跟踪不使用任何类型推断,修复到Int @ cps [ST].然后,CPS插件将计算映射到正确的类型(如String @ cps [ST]).状态由继续返回一个State => State函数,该函数接受当前状态(int的集合)并返回下一个状态.复位的返回类型是从状态到状态(类型ST)的函数,它将采用初始状态并返回最终状态.

最后一个技巧是使用var来捕获结果,同时仍然保持预期的重置类型.

(编辑:李大同)

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

    推荐文章
      热点阅读