私はthis monad tutorialを読んでいます。このチュートリアルで動作するSheep
を実装しようとしています。HaskellでSheepを定義するにはどうすればいいですか?
私はこの
-- No Sheep or Name, Father Sheep, Mother Sheep
data Sheep = Nothing | String Sheep Sheep
を試してみましたが、それは動作しません。
私はthis monad tutorialを読んでいます。このチュートリアルで動作するSheep
を実装しようとしています。HaskellでSheepを定義するにはどうすればいいですか?
私はこの
-- No Sheep or Name, Father Sheep, Mother Sheep
data Sheep = Nothing | String Sheep Sheep
を試してみましたが、それは動作しません。
コンストラクタ定義の最初の部分は、コンストラクタの名前です。その引数の型はそれ以降に来ます。また、コンストラクタに引数がない場合、名前の後には何もないので、 "Nothing"はありません。私たちは「NoSheepを」あなたのコンストラクタに名前を付け、「羊」していたのであれば、それは次のようになります。
data Sheep = NoSheep | Sheep String Sheep Sheep
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
。