想象一下,我有一個數據類型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