2012-03-03 12 views

答えて

6

コンストラクタ定義の最初の部分は、コンストラクタの名前です。その引数の型はそれ以降に来ます。また、コンストラクタに引数がない場合、名前の後には何もないので、 "Nothing"はありません。私たちは「NoSheepを」あなたのコンストラクタに名前を付け、「羊」していたのであれば、それは次のようになります。

data Sheep = NoSheep | Sheep String Sheep Sheep 
2

sepp2kが正しく仕様を翻訳しますが、チュートリアルでは、あなたよりも別の何かを言う:

私たちは考え確かに私たちのすべての我々の 羊の遺伝的な歴史を知りたいので、私たちは母親と父親の機能が必要になります。しかし、これらの はクローン羊であるため、必ずしも母親と父親の両方がいるとは限りません!

最も簡単な方法は、次のようになります。

data Sheep = Sheep String (Maybe Sheep) (Maybe Sheep) 

しかし、私はrecodの構文は、ここで明確になると思いますし、あなたの自由のために必要な方法を与える:

data Sheep = Sheep { name :: String 
        , mother :: Maybe Sheep 
        , father :: Maybe Sheep 
        } 

は、しかし、これが可能にしますヒツジがでもなく、マザーでも fatherでもある可能性があります。この可能性を回避する最も簡単な方法は、単純にすべてのケースを列挙することです:

ます。また、ここで定義され Orデータ型を使用でき
data Sheep = SheepWithMother String Sheep 
      | SheepWithFather String Sheep 
      | SheepWithMotherAndFather String Sheep Sheep 

mother (SheepWithMother _ m) = Just m 
mother (SheepWithMotherAndFather _ m _) = Just m 
mother _ = Nothing 

father (SheepWithFather _ f) = Just f 
father (SheepWithMotherAndFather _ _ f) = Just f 
father _ = Nothing 

Or a bがあり、私たち自身のバージョンと同様にhttp://hackage.haskell.org/packages/archive/data-or/1.0.0/doc/html/Data-Or.html

data Sheep = Sheep Int (Or Sheep Sheep) 

を3つのコンストラクタFst a,Snd bおよびBoth a b

関連する問題