answering a question with a suggestion to use GADTsの場合、パフォーマンスに関するいくつかの質問がコメントに表示されました。質問は型クラスPlotValue
関与:GADTを使用した場合のパフォーマンスの影響
class PlotValue a where
value :: a -> Double
をし、私の答えは、GADT Input
を使うことを提案:
data Input where
Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input
が、詳細には、私は考え、軽微です。
私は、パフォーマンスの二つの側面について思ったんだけど:
時間: を
case x of
Input (Just a) (Just b) -> value a * value b
_ -> 0.0
を超えると2 Maybe
に一致する通常のコスト上記のようなパターンマッチによって生じたいかなるランタイムコストがあります値?
スペース: タイプInput
の値がどのくらいのストレージのオーバーヘッドを運ぶのですか?私の推測では、タイプInput
(それぞれ 'ポインター'?)のそれぞれの値について、の2つの辞書があり、[Input]
は、(Just Double, Just Double)
を使用するよりもメモリ使用量がはるかに非効率的であるか、 (# #Double, #Double #)
- value
の結果を通常のまたは展開されていないタプルに格納する場合。
私はGADTが私に与える表現力が大好きですが、パフォーマンスの側面についてはこれまで考えていませんでした。誰も私にこれについてもっと教えてもらえますか?
しかし、OOPと非最終クラスのオブジェクトについても同様のことが言えます(メソッドに渡された各オブジェクトには、仮想メソッドテーブルまたは同等のものへのポインタが必要です).C++またはJavaは、アプリケーション。もちろんこれらの両方の言語では、パフォーマンスのためにいくつかのもののために配列のような非オブジェクト指向のものを使用します。明らかなコメントですが、私はそれを視点に入れたいと思っていました。 –
あなたの答えをありがとう、私の疑惑を確認してください! 'value'の結果が' Double'なので、 'Double - > Double - > Double'型で常に使われるように、case式の'(*) 'は私のようですが、' value'はすべての時間を評価し、(String型の解析のように)高価になる可能性があるので、ここでは普通のDouble型の方がはるかに優れています。 – yatima2975