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
:
data TeX = TeXt String | TeXmath String deriving (Show,Read,Eq) teX (TeXt t) = t teX (TeXmath t) = "$$" ++ t ++ "$$"
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.
ikincisi aslında ne tipeclass hakkında değildir, OOP – Arjan
'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
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