다음 두 가지 전략 중 어떤 것이 함수 오버로드에 가장 효율적인지 궁금합니다 (필자의 예제에서는 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 ++ "$$"
반드시 처음 사용하기 쉽다는 및에 대한 두 번째 쉽게 높이다; 하지만 하나가 다른 것보다 빠르게 실행되는지 또는 하스켈이 정확히 같은 방식으로 구현하는지 궁금합니다.
OCR에서 클래스를 복제하려고하는 것처럼 보이지는 않습니다. – Arjan
그런 식으로 성능에 관심을 가져서는 안되며, 'String'으로 렌더링하는 것과 관련해서는 안됩니다. 즉, 본질적으로 너무 느려 클래스 사전에 의해 부과 될 수있는 오버 헤드는 무시할 만하다. 실제로, 당신은 정말로 여기에'String'을 렌더링하지 말고,''Text'] (http://hackage.haskell.org/packages/archive/text/latest/doc/html/Data-Text.html)에 렌더링해야합니다.) (또는 ['LaTeX'] (http://hackage.haskell.org/packages/archive/HaTeX/3.5/doc/html/Text-LaTeX-Base-Syntax.html#t:LaTeX), duh). – leftaroundabout
나는 Arjan과 있는데, 두 번째는 정말 나쁜 생각처럼 보입니다. 예를 들어 [this one] (https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs) (githubpandoc repo)와 같은 유형이 ' teX' 함수 [here] (https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Writers/LaTeX.hs) – applicative