如何在Haskell中定义绵羊?

时间:2012-03-03 15:54:51

标签: haskell

我正在阅读this monad tutorial。我正在尝试实施适用于本教程的Sheep

我试过这个

-- No Sheep or Name, Father Sheep, Mother Sheep
data Sheep = Nothing | String Sheep Sheep

但它不起作用。

2 个答案:

答案 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 aSnd bBoth a b