6

我想知道以下两种策略中的哪一种对于重载函数最有效(在我的示例中是函数 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 ++ "$$"
    

当然,第一个更容易使用,第二个更容易丰富;但我想知道一个是否会比另一个运行得更快,或者 Haskell 是否会以完全相同的方式实现它们。

4

1 回答 1

5

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

现在,大约更快?我想,对于内存占用较小的程序,第一种方法由于内存分配较少且对实际调用teX函数的间接性较少,因此速度稍快一些。对于分配繁重的程序,同样的情况会一直持续到程序达到某个内存分配阈值——第一个版本稍后会达到这个阈值,因此一旦第二个版本达到那个点,速度会更快一些。

于 2013-04-27T22:48:17.863 回答