我正在阅读this monad tutorial。我正在尝试实施适用于本教程的Sheep
。
我试过这个
-- No Sheep or Name, Father Sheep, Mother Sheep
data Sheep = Nothing | String Sheep Sheep
但它不起作用。
答案 0 :(得分:6)
构造函数定义的第一部分是构造函数的名称。其论点的类型就在此之后。此外,如果构造函数没有参数,则名称后面没有任何内容,因此没有“Nothing”。因此,如果我们将您的构造函数命名为“NoSheep”和“Sheep”,那么它将是:
data Sheep = NoSheep | Sheep String Sheep Sheep
答案 1 :(得分:2)
sepp2k正确翻译了您的规范,但教程说的不同于您:
我们当然想知道我们所有人的遗传史 羊,所以我们需要母亲和父亲的功能。但既然这些 克隆羊,他们可能并不总是有母亲和父亲!
最简单的方法是:
data Sheep = Sheep String (Maybe Sheep) (Maybe Sheep)
但我认为recod语法在这里会更清楚,并为您提供免费的必要方法:
data Sheep = Sheep { name :: String
, mother :: Maybe Sheep
, father :: Maybe Sheep
}
然而,这允许绵羊既不母亲也不父亲的可能性。避免这种可能性的最简单方法是简单地列举所有情况:
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
数据类型:http://hackage.haskell.org/packages/archive/data-or/1.0.0/doc/html/Data-Or.html
data Sheep = Sheep Int (Or Sheep Sheep)
与我们自己的版本类似,Or a b
有三个构造函数Fst a
,Snd b
和Both a b
。