2013-04-27 26 views
6

Aşağıdaki iki stratejiden hangisinin bir işlevi aşırı yüklemek için en etkili yol olduğunu merak ediyorum (buradaki örnekte bu fonksiyon teX). data ve desen eşleştirme kullanarakHaskell'de etkin bir aşırı yükleme

  1. :

    data TeX 
        = TeXt String 
        | TeXmath String 
        deriving (Show,Read,Eq) 
    teX (TeXt t) = t 
    teX (TeXmath t) = "$$" ++ t ++ "$$" 
    
  2. Veya soyutlama biraz kullanılarak:

    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 ++ "$$" 
    

Şüphesiz ilk kullanımı kolaydır ve ikinci daha kolay zenginleştirmek; ama merak ediyorum, biri diğerinden daha hızlı koşarsa ya da Haskell onları aynı şekilde uygularsa.

+2

ikincisi aslında ne tipeclass hakkında değildir, OOP – Arjan

+2

'da sınıfları çoğaltmaya çalışıyorsunuz gibi görünüyor. Bu şekilde performansla ilgilenmemelisiniz, 'String'in oluşturulmasına benzer bir şey için değil: bunlar aslen öylesine yavaş ki, sınıf sözlük tarafından uygulanabilecek herhangi bir ek yük, ihmal edilebilir. Aslına bakarsanız, buradaki '' '' '' '' '' '' '' '' '' '' '' '' '[' '] '' yerine, '[' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' gerçeklememelisiniz.) (veya ['LaTeX'] (http://hackage.haskell.org/packages/archive/HaTeX/3.5/doc/html/Text-LaTeX-Base-Syntax.html#t:LaTeX), duh). – leftaroundabout

+0

Arjan'lıyım, ikincisi gerçekten kötü bir fikir gibi görünüyor. Örneğin, bu gibi bir türün (https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs) (githubpandoc repo) sizin gibi bir şey tarafından oluşturulduğunu görün teX' işlevi [burada] (https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Writers/LaTeX.hs) – applicative

cevap

5

İlki daha fazla alan verimli. Bir tip sınıfında tanımlanan bir işlevi çağırmak, nesne yönelimli bir dilde bir yöntemi çağırmakla eşdeğerdir: TeX t türünde polimorfik olan tüm işlevler (ör., Tip imzasında TeX t => vardır) ek, örtük bir parametre taşımak zorunda kalacaktır. Örneğin, belirli bir örnek için TeX belirli bir yöntemi saklayan bir sözlük.

Şimdi, daha hızlı? Küçük bir bellek ayak izi olan programlarda, daha az bellek tahsisi ve teX işlevini gerçekten çağırmak için daha az dolaylı olarak ilk yol marjinal olarak daha hızlıdır. Atama-ağır programlar için, program, ilk versiyonun daha sonra vuracağı bir bellek ayırma eşiği —'a ulaşana kadar aynı tutacaktı ve bu yüzden bu noktaya varan bir kere daha hızlı olacaktır.

+7

Bu cevabın aşırı derecede basit olduğunu düşünüyorum. Inlining ve tip-uzmanlaşma nedeniyle, 'TeX' sözlük tamamen derleme zamanında çözülecek olasıdır. Performansa gelince, fazladan indirmenin tahsisden çok daha büyük bir etki yarattığını tahmin ediyorum. Ama bunun için sezgime güvenmem. –

+1

Bu doğru, ancak esas olarak doğru değil; İyileştiricinin zevkine uymak için çok çalışabiliriz (ama), ancak bunu, güvenilir bir şekilde sağlanamadığı için, tip sınıflarını kullanmanın temel yükünün üstesinden gelmek olarak saymıyorum. – jpaugh

İlgili konular