Trait-based dispatch 与 typeclass 有何异同?


#1

一直不太清楚SimpleTraits.jl的用法,好像跟typeclass的功能有点像:

julia> using SimpleTraits

julia> @traitdef Tr{Array}

julia> @traitfn fn(x::X) where {X<:Vector; Tr{X}} = 4
fn (generic function with 2 methods)

julia> @traitimpl Tr{Vector{Int}}

julia> fn([1,2,3])
4

julia> fn([1.0,2.0,3.0])
ERROR: MethodError: no method matching fn(::Type{Not{Tr{Array{Float64,1}}}}, ::Array{Float64,1})
Closest candidates are:
  fn(::Type{Tr{X<:(Array{T,1} where T)}}, ::X<:(Array{T,1} where T)) where X<:(Array{T,1} where T) at /Users/gnimuc/.julia/packages/SimpleTraits/CZOA2/src/SimpleTraits.jl:332
Stacktrace:
 [1] fn(::Array{Float64,1}) at /Users/gnimuc/.julia/packages/SimpleTraits/CZOA2/src/SimpleTraits.jl:350
 [2] top-level scope at none:0

还有trait这个术语一般表示什么意思?


trait 的翻译
#2

trait是指类型的一些信息吧?比如

name(::{<:Me}) = "Roger"

#3

不太严格的来说,应该都是polymorphism加上类型上constraints。trait这个词现在已经各种乱用了,一般用来指满足一些性质的类型吧。不过,Haskell貌似typeclass声明里面里面不能像这样直接绑定值的,Scala里面我倒是能写出来差不多的。