数据类型 Person mother from mother (grandmother)

Datatype Person mother from mother (grandmother)

假设我有一个数据类型 Person

data Person = Person String Person

2.人应该是妈妈

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

只会显示x人的母亲。 怎么给奶奶看?

首先,您的数据定义缺少基本情况。假设这代表 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

使用模式匹配,您不限于一级构造函数,您可以嵌套它们以进一步发展"in":

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

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


中汲取灵感,找到一个人的母亲是可能的...

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

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

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

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