gpt4 book ai didi

haskell - Haskell 中的高效重载

转载 作者:行者123 更新时间:2023-12-04 15:12:48 40 4
gpt4 key购买 nike

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

  • 使用 data和模式匹配:
    data TeX
    = TeXt String
    | TeXmath String
    deriving (Show,Read,Eq)
    teX (TeXt t) = t
    teX (TeXmath t) = "$$" ++ t ++ "$$"
  • 或者使用一些抽象:
    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 是否会以完全相同的方式实现它们。

    最佳答案

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

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

    关于haskell - Haskell 中的高效重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257401/

    40 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com