仍在通過 Get Programming with Haskell 學習 Haskell。
在第 7 課中有以下練習:
Haskell 中的
tail函式在空串列上呼叫時會回傳錯誤。修改myTail,使其通過回傳空串列來處理空串列的情況。
其中myTail定義如下:
myTail (_:xs) = xs
在同一節課中,我們被告知可以使用模式匹配檢查空串列引數。這是書中的一個例子:
isEmpty [] = True
isEmpty _ = False
所以這就是我認為可以解決問題的方法
myTail [] = []
myTail (_:xs) = xs
但是,當我將此函式與空串列一起使用時,它會引發例外:
ghci> myTail []
*** Exception: <interactive>:2:1-17: Non-exhaustive patterns in function myTail
怎么了?
uj5u.com熱心網友回復:
看起來你完全在 ghci 中定義你的函式,你的問題最可能的根源是每一行都引入了一個新 myTail函式。在這種情況下,當你呼叫myTail []當前myTail函式時不會處理空串列,所以你會得到一個例外。
ghci> myTail [] = []
ghci> myTail (_:xs) = xs
ghci> myTail []
*** Exception: <interactive>:3:1-18: Non-exhaustive patterns in function myTail
:{您可以使用和定義跨多行的函式:}。
ghci> :{
ghci| myTail [] = []
ghci| myTail (_:xs) = xs
ghci| :}
ghci> myTail []
[]
不過,另外值得注意的是,當給定一個空串列時,回傳串列尾部的函式回傳一個空串列并沒有多大意義,而實際上空串列沒有尾部。
您可能想要使用Maybe來處理這種可能性。
ghci> :{
ghci| myTail [] = Nothing
ghci| myTail (_:xs) = Just xs
ghci| :}
ghci> :t myTail
myTail :: [a] -> Maybe [a]
ghci> myTail []
Nothing
ghci> myTail [1, 2, 3]
Just [2,3]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528488.html
標籤:哈斯克尔
