Vas*_*iuk 10 scala language-design protocols clojure structural-typing
在观看了Rich Hickey对Clojure 1.2 协议的采访,并且对Clojure知之甚少之后,我对Clojure协议提出了一些问题:
Jam*_*Iry 15
完全不相关.
Scala是一种静态类型语言.Clojure是一种动态类型语言.这种差异从根本上影响了它们.
结构类型是静态类型,周期.它们只是让编译器静态证明一个对象具有特定结构的一种方式(我说在这里证明,但是铸造可能会像往常一样导致虚假证据).
Clojure中的协议是一种创建动态调度的方法,它比反射或在地图中查找更快.从语义上讲,它们并没有真正扩展Clojure的功能,但在操作上它们比以前使用的机制要快得多.
与Java接口一样,Scala特性更接近协议,但同样存在静态与动态问题.Scala特征必须在编译时与类关联,类似于Java接口.在事实之后,甚至可以由第三方将Clojure协议添加到数据类型中.
通过包装器/代理模式或动态代理(http://download.oracle.com/javase/1.4.2/docs/guide/reflection/proxy.html)等机制,可以在Java和Scala中使用类似Clojure协议的东西.但是这些将比Clojure协议更加笨拙,并且获得对象身份也很棘手.
Jör*_*tag 10
Clojure中协议的目的是以有效的方式解决表达式问题.
[见:对clojure协议的简单解释.]
Scala对表达式问题的解决方案是隐含的.因此,从语义上讲,这是与Scala中Clojure协议最接近的等价物.(在Haskell中,它将是Typeclasses或类型系列.)
正如我从这篇介绍性博客中所理解的那样,Closure Protocols更接近于Scala Traits,而不是结构类型(因此,不能用它来替代它们,回答我的第二个问题):
/* ----------------------- */
/* --- Protocol definition */
/* ----------------------- */
(defprotocol Fly
"A simple protocol for flying"
(fly [this] "Method to fly"))
/* --- In Scala */
trait Fly{
def fly: String
}
/* --------------------------- */
/* --- Protocol implementation */
/* --------------------------- */
(defrecord Bird [nom species]
Fly
(fly [this] (str (:nom this) " flies..."))
/* --- In Scala */
case class Bird(nom: String, species: String) extends Fly{
def fly = "%s flies..." format(nom)
}
/* --------------------- */
/* --- Dynamic extension */
/* --------------------- */
(defprotocol Walk
"A simple protocol to make birds walk"
(walk [this] "Birds want to walk too!"))
(extend-type Bird
Walk
(walk [this] (str (:nom this) " walks too..."))
/* --- In Scala */
trait Walk{
def walk = "Birds want to walk too!"
}
implicit def WalkingBird(bird: Bird) = new Walk{
override def walk = "%s walks too..." format(bird.nom)
}
/* --------------- */
/* --- Reification */
/* --------------- */
(def pig (reify
Fly (fly [_] "Swine flu...")
Walk (walk [_] "Pig-man walking...")))
/* --- In Scala */
object pig extends Fly with Walk{
def fly = "Swine flu..."
override def walk = "Pig-man walking..."
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2315 次 |
| 最近记录: |