以下の2つの戦略のうち、どれが関数のオーバーロードに最も効率的であるのだろうか(私の例では関数teX)。Haskellの効率的なオーバーロード
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がまったく同じ方法でそれらを実装するかどうか疑問に思います。
OCRでクラスを複製しようとしているように見えるのは、2番目のタイプメタルは実際にはありません。 – 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と一緒にいて、2番目は本当に悪い考えのようです。たとえば、[this one](https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs)(githubpandoc repo)のようなタイプが ' teX関数[ここ](https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Writers/LaTeX.hs) – applicative