實作
hasSameLength :: [a] -> [b] -> Bool決定兩個串列是否相同長度的函式。length禁止使用該功能。
例如:
hasSameLength "apple" "peach" == True,hasSameLength "apple" "cherry" == False,hasSameLength [] [1..] == False,hasSameLength [1..] [] == False
到目前為止,我已經嘗試過
hasSameLength [] [] = True
hasSameLength [] [a] = False
hasSameLength [a] [] = False
hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)
但如果只有一個引數串列為空,我會收到non-exhaustive patterns錯誤訊息。hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys) && hasSameLength (x) (y)由于某種原因,這樣做會導致 GHCi 卡在運行時。
uj5u.com熱心網友回復:
hasSameLength [] [] = True
hasSameLength [] _ = False
hasSameLength _ [] = False
hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)
請注意,模式是按從上到下的順序匹配的。因此,當兩個串列都為空(第一個模式)時,如果其中一個為空,則它已經是False. 我們不關心另一個串列是有一個元素還是多個元素,我們用下劃線表示_。
在您的代碼中,您的模式如下:
hasSameLength [] [a] = False
hasSameLength [a] [] = False
當一個串列為空而另一個串列只有一個元素時,這兩行會處理。但是當一個是空的而另一個有 2 時呢?還是很多?這是您錯過該模式的情況,并且幾乎不可能覆寫它,因為下一個模式:
hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)
也不包括它,因為其中一個串列是空的。
一種對我有幫助的思考方式是:[] []作為一種and情況,您需要兩個引數都為空(或匹配提供的模式)以便模式匹配,_ []并且當其中一個是類似模式時_下劃線作為一種or情況,您只需要一個匹配項即可作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331231.html
下一篇:比較記錄的欄位
