2012-05-17 8 views
13
data Ray = Ray Vector Vector 

または慣用Haskellで好ましいハスケル:タプル対代数データ

type Ray = (Vector, Vector) 

?なぜ私はもう一方を使うべきですか?
パフォーマンスは気にしません。

機能、例えばと少し違いを作るようだ:

trace :: Ray -> … 

trace (Ray x d) = … 
-- OR 
trace (x, d) = … 

答えて

10

それがより明確に、プログラマの意図を示してdataバージョンが好まれる - 新しいタイプを作成することによって、あなたはすべてに指摘されていますこれは単なるタプルではなく、意味のある意味エンティティである、Rayです。

これにより、型システムにさらに寄与し、Rayのカスタムインスタンスと、タプルでの最適化が不可能になります。

あなたはまた、二つの組み合わせの一種である第三の選択肢を検討してください
+1

右。タイプについての重要なポイントは、データの表現よりもはるかに重要です。それらは有用な構造を特徴付ける。 – pigworker

+0

さて、それは理にかなっています。 'type'は実際には新しいデータ型ではなく、シノニムのためのものです。しかし、線はどこかに描画されなければならない。 'type Color =(Int、Int、Int)'は適切だろうか? – mk12

+2

いいえ、パフォーマンス上の理由から、カラーパッケージのように、パックされたベクタータイプのカラーを持つ方が理にかなっています。このような意味のあるタイプは、最適化して特殊化することができます。 http://hackage.haskell.org/packages/archive/colour/2.3.3/doc/html/src/Data-Colour-Internal.html#Colour –

6

:、私の意見では、あなたが複数の選択肢を持っているときの状況で使用されている、あるいは場合によってはnewtype

newtype Ray = Ray (Vector, Vector) 

代数的データ型を型を再帰的にする必要があります。しかし、これは何かのために残忍かもしれません。

ドン・スチュワートは、タプルの型シノニムを作成することは、そのタプル・タイプを直接使用することと同じであることを指摘しました。型同義語には自分自身のアイデンティティーはありません。したがって、型チェッカーは型とタプルを区別できないため、必要な型を使用していることをチェックできません。また、タプルとまったく同じインスタンスを持つことになります。

newtypeでは、タプルと同じ基本タイプを使用できます。タイプチェッカーとは別のタイプで、別々のインスタンスがあります。

+0

これは、カレー化されたフォームを使用するよりも一般的ではないようです。たぶん句読点が多いからです。 – luqui

3

私は非常に便利見つかった第4の代替はレコードです:

data Ray = Ray { from, to :: Vector } 

は、彼らは基本的に「ノーマル」のADTのすべての機能を持っていますが、いくつかの追加構文砂糖と。特に、部分的に変更された値のコピーを取得することを容易にします。状況によってはレコードがあまりにも限られていることは事実ですが、fclabelsのような「改良されたバージョン」ではさらに進歩することができます。

関連する問題