想象一下,我有一个数据类型Person
。数据类型从母亲(祖母)的人母亲
data Person = Person String Person
的2人应该是母亲。
showGrandmother :: Person -> Maybe Person
showGrandmother (Person _ mother) = Just mother
只会从人x显示母亲。 我如何显示祖母?
想象一下,我有一个数据类型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
随着模式匹配,则AREN不限于构造函数的一个级别,您可以将它们嵌套在“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
...确保处理基本情况时有人没有奶奶。你原来的类型不需要处理这种情况,因为每个人都必须有一个祖母。
而采取的灵感来自@Karafka's answer,有可能分解出找到一个人的母亲......
showMother :: Person -> Maybe Person
showMother (Person _ (Just mother)) = Just mother
showMother _ = Nothing
...并使用的事实,Maybe
是一个单子,可以使用它如下。
showGrandmother :: Person -> Maybe Person
showGrandmother x = showMother x >>= showMother
我怀疑理解上述一元代码将超出这个特定问题的范围。
说实话,我不明白那个代码。 我该如何修改我的功能(showGrandmother)它的工作原理? –
@ R.Mayer请尝试将“我不明白该代码”转换为可以回答的问题。 (你有什么难以理解的地方?你在阅读代码的过程中遇到困难?)至于“我该如何修改我的函数”,好吧,我们只需要说这个答案会很快理解答案写在这里。 –
尝试'showGrandmother = grandmother' – karakfa