如何使用新的scala语法重写"TowersOfHanoi" [英] How to use new scala syntax to rewrite "TowersOfHanoi"

查看:172
本文介绍了如何使用新的scala语法重写"TowersOfHanoi"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

代码来自 https://gist.github.com/jrudolph/66925 :

object TowersOfHanoi {
  import scala.reflect.Manifest

  def simpleName(m:Manifest[_]):String = {
    val name = m.toString
    name.substring(name.lastIndexOf('$')+1)
  }

  trait Nat
  final class _0 extends Nat
  final class Succ[Pre<:Nat] extends Nat

  type _1 = Succ[_0]
  type _2 = Succ[_1]
  type _3 = Succ[_2]
  type _4 = Succ[_3]

  case class Move[N<:Nat,A,B,C]()

  implicit def move0[A,B,C](implicit a:Manifest[A],b:Manifest[B]):Move[_0,A,B,C] = { 
        System.out.println("Move from "+simpleName(a)+" to "+simpleName(b));null
  }

  implicit def moveN[P<:Nat,A,B,C](implicit m1:Move[P,A,C,B],m2:Move[_0,A,B,C],m3:Move[P,C,B,A])
    :Move[Succ[P],A,B,C] = null 

  def run[N<:Nat,A,B,C](implicit m:Move[N,A,B,C]) = null

  case class Left()
  case class Center()
  case class Right()

  def main(args:Array[String]){
    run[_2,Left,Right,Center]
  }
}

它使用了旧的scala语法,其中一些可能已被弃用(例如ClassManifest),还有一些新功能(例如sealed)

It uses old scala syntax, and some of them are probably deprecated(e.g. ClassManifest), and some new feature(e.g. sealed)

如何使用当前的新scala进行改进?

How to improve it with current new scala?

推荐答案

恕我直言,您唯一可以改进的两件事是将>的 all 代码替换为ClassTag并更改trait Natsealed trait Nat.

IMHO, the only 2 things you can improve is to replace all code occurrences of Manifest to ClassTag and changing trait Nat to sealed trait Nat.

这篇关于如何使用新的scala语法重写"TowersOfHanoi"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆