想象一下,我有一个数据类型Person
。
data Person = Person String Person
2.人应该是母亲。
showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ mother) = Just mother
只会向人x展示母亲。 我该如何向祖母展示?
答案 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代码的理解范围超出了这个特定问题。