Haskell中的高效重载

时间:2013-04-27 22:14:24

标签: haskell

我想知道以下两种策略中的哪一种对于重载函数最有效(这里是我的例子中的函数teX)。

  1. 使用data和模式匹配:

    data TeX
      = TeXt String
      | TeXmath String
      deriving (Show,Read,Eq)
    teX (TeXt t)    = t
    teX (TeXmath t) = "$$" ++ t ++ "$$"
    
  2. 或使用一点抽象:

    class TeX t where
      teX :: t -> String
    
    newtype TeXt = TeXt String
      deriving (Show,Read,Eq)
    instance TeX TeXt where
      teX (TeXt t) = t
    
    newtype TeXmath = TeXmath String
      deriving (Show,Read,Eq)
    instance TeX TeXmath where
      teX (TeXmath t) = "$$" ++ t ++ "$$"
    
  3. 当然第一个更容易使用,第二个更容易充实;但是我想知道一个人是否会跑得比另一个人快,或者Haskell会以完全相同的方式实现它们。

1 个答案:

答案 0 :(得分:5)

第一个更节省空间。调用类型类中定义的函数等同于以面向对象的语言调用方法:类型为TeX t的多态的任何函数(即,类型签名中具有TeX t =>)将具有携带一个额外的隐式参数,即存储TeX给定实例的特定方法的字典。

现在,快一点?我想,对于占用内存较少的程序,第一种方法由于内存分配较少而实际调用teX函数的间接性较小,因此速度稍快。对于分配繁重的程序,同样会保持不变,直到程序达到某个内存分配阈值 - 第一个版本将在稍后命中,并且因此一旦第二个程序达到该点时会更快一些。