2

次のようにカスタム データ型を指定したいと思います。

data Colour = Red | Green | Blue deriving (Show, Eq, Enum)
data Geometry = Star | Square deriving (Show, Eq, Enum)
data Shape = Shp {colour :: Colour, geom :: Geometry} deriving (Show, Eq, Enum)

では、色を常に指定する必要がない場合はどうでしょうか。これは正しい方法ですか?

data Shape = Shp {colour :: Maybe Colour, geom :: Geometry} deriving (Show, Eq, Enum)

これは Haskell で行うべき方法ですか? これの代替案と欠点はありますか?これまでのところ、ものはコンパイルされていますが、私は学習曲線の始まりにあり、フォローアップ機能がこの状況にどのように対処するかを示すことなく、これが使用されている場所を 1 つだけ見つけました。

たとえば、色などを介して値にアクセスしたり、Show 関数を使用すると、多くの「Just Red」などになります。

4

2 に答える 2

3

私はほとんど「はい」という一言の応答を書き、送信をクリックしました。あなたが書いたことは絶対に正しいです。

ほとんどの言語と同様に、これを行うには他にも多くの方法がありますが、これは実際には「慣用的な」方法です (Haskell の群衆と通信するには、この単語を学ぶ必要があります :))。たとえば、2 つ目の劣悪な方法は、Color を拡張してNoColour... を含めることです。しかし、これはきれいなデータ型ではなく、結果の型は再利用性が低くなります (つまり、色だけの型は Maybe を使用して簡単に拡張できますが、NoColour必要に応じて拡張を解除できない型)。

ただし、警告の一言:

Maybe、などで何かをラップするとEither、コードが短期間で複雑になることがわかります。これは、単純な関数でさえJustNothingケース、および色を考慮する必要があるためです。多くの場合、ケースに対処するためだけにステートメントの階段を使い始めるかもしれません.... これを修正することは、Haskell (モナドなど) について実際に学び始めるときであり、コードはすぐに優れたものになり始めます。

(投稿全体でそのように色を綴らせてくれるなんて信じられません:))。

于 2014-11-05T17:27:23.463 に答える