2017-05-24 90 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 

我懷疑理解上述一元代碼將超出這個特定問題的範圍。