数据类型母亲的母亲(祖母)

时间:2017-05-24 20:06:58

标签: haskell types maybe

想象一下,我有一个数据类型Person

data Person = Person String Person

2.人应该是母亲。

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ mother) = Just mother

只会向人x展示母亲。 我该如何向祖母展示?

2 个答案:

答案 0 :(得分:4)

首先,您的数据定义缺少基本情况。假设这代表matrilineality,我将从Eve开始作为基本情况

data Person = Eve | Person String Person deriving (Show)

定义mother函数

mother Eve = Nothing
mother (Person _ m) = Just m

现在祖母正在申请两次

grandmother = \x -> mother x >>= mother

使用Control.Monad Kleiski操作符,可以很好地编写

grandmother = mother >=> mother

答案 1 :(得分:2)

使用模式匹配,您不仅限于一个级别的构造函数,您可以将它们嵌套以进一步“进入”:

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ (Person _ grandmother)) = Just grandmother

作为旁注,我不是Haskell专家,但似乎数据类型对于什么是家谱树的模型来说有点循环。如果没有它引用另一个人,你实际上无法创建一个人。也许更好的事情......

data Person = Person String (Maybe Person)

......在这种情况下,找到祖母可以做到......

showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ Just (Person _ (Just grandmother)))) = Just grandmother
showGrandmother _                                              = Nothing

...当有人没有祖母时,确保处理基本情况。你的原始类型不需要处理这种情况,因为每个人都必须有一个祖母。

@Karafka's answer中汲取灵感,可以分析出找到一个人的母亲......

showMother :: Person -> Maybe Person
showMother (Person _ (Just mother)) = Just mother
showMother _                        = Nothing

...并且使用Maybe是monad的事实,可以使用它如下。

showGrandmother :: Person -> Maybe Person
showGrandmother x = showMother x >>= showMother

我怀疑上述monadic代码的理解范围超出了这个特定问题。