在學習Haskell的程序中,我遇到了這個flipMaybe函式:
。flipMaybe :: [Maybe a] -> Maybe [a]
flipMaybe [] = Just [] 。
flipMaybe (Nothing:xs) = Nothing[/span
flipMaybe (Just x:xs) = caseflipMaybe xs of
Nothing -> Nothing
Justls -> Just (x:ls)
我無法理解最后一行的內容。這里的ls是什么?這里的遞回是如何作業的?或者換句話說,誰能告訴我這個函式如何解決flipMaybe [Just 1, Just 2, Just 3]?(一步一步來)
uj5u.com熱心網友回復:
我無法理解最后一行的內容。這里的
ls是什么?
如果對串列尾部的遞回呼叫回傳一個Just ls,那么ls就是被Just所包裹的串列。因此,如果flipMaybe [Just 3]被呼叫,這將回傳一個Just [3],因此ls是[3]。
這是用xs來預設串列。如果我們這樣評估 flipMaybe [Just 1, Just 2],那么我們首先檢查第一項,如果那是一個 Nothing,我們回傳 Nothing:我們不關心串列的其余部分,我們知道結果將是一個 Nothing,如果它是一個 Just ...,我們應該檢查 flipMaybe [Just 2] 將回傳什么。如果它回傳一個Nothing,那么我們就回傳Nothing,因為這意味著在串列的尾部有一個Nothing。如果它是一個Just ls,那么我們回傳一個Just (x : ls),我們因此將串列中的專案預置在遞回呼叫的結果中。
如果串列因此看起來像[Just 2, Nothing, Just 3],那么我們首先調查Just 2,因為它不是Nothing,我們用flipMaybe [Nothing, Just 3]做一個遞回呼叫。由于該串列以Nothing開始,Nothing將從flipMaybe [Nothing, Just 3]回傳,因此我們為flipMaybe [Just 2, Nothing, Just 3]回傳Nothing。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316896.html
標籤:
