2017-05-24 84 views
0

想象一下,我有一个数据类型Person数据类型从母亲(祖母)的人母亲

data Person = Person String Person 

的2人应该是母亲。

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

只会从人x显示母亲。 我如何显示祖母?

回答

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 
+0

说实话,我不明白那个代码。 我该如何修改我的功能(showGrandmother)它的工作原理? –

+1

@ R.Mayer请尝试将“我不明白该代码”转换为可以回答的问题。 (你有什么难以理解的地方?你在阅读代码的过程中遇到困难?)至于“我该如何修改我的函数”,好吧,我们只需要说这个答案会很快理解答案写在这里。 –

+0

尝试'showGrandmother = grandmother' – karakfa

2

随着模式匹配,则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 

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