實作
filterA2 :: [Char] -> [Char] -> ([Char], [Char])去除字符功能'a'和'A'從兩個串列并回傳結果為一對。例如:
filterA2 "Always" "runAway" == ("lwys", "runwy")
filterA2 "Cherry" "Tree" == ("Cherry", "Tree")
到目前為止,我已經嘗試過:
filterA2 [] [] = ([], [])
filterA2 ['a'] ['a'] = ([], [])
filterA2 ['A'] ['A'] = ([], [])
filterA2 ['a'] [xs] = ([], [xs])
filterA2 [xs] ['a'] = ([xs], [])
filterA2 ['A'] [xs] = ([], [xs])
filterA2 [xs] ['A'] = ([xs], [])
filterA2 (x:xs) (y:ys) = filterA2 (xs) (ys)
("", "")無論我輸入什么,它總是會回傳。我可能使用了太多基本案例。
uj5u.com熱心網友回復:
您的方法的問題是:您的模式僅在每個串列中只有一個字符時才有效......
filterA2 :: [Char] -> [Char] -> ([Char], [Char])
filterA2 l1 l2 = (remove l1, remove l2)
where
remove :: [Char] -> [Char]
remove [] = []
remove (x:xs)
|x == 'A' || x == 'a' = remove xs
| otherwise = x : remove xs
uj5u.com熱心網友回復:
import Data.Char (toLower)
filterA2 :: [Char] -> [Char] -> ([Char], [Char])
filterA2 [] [] = ([], [])
filterA2 (x:xs) []
| toLower x == 'a' = (xs', [])
| otherwise = (x:xs', []) where
(xs', _) = filterA2 xs []
filterA2 [] (y:ys)
| toLower y == 'a' = ([], ys')
| otherwise = ([], y:ys') where
(_, ys') = filterA2 [] ys
filterA2 (x:xs) (y:ys)
| toLower x == 'a' && toLower y == 'a' = (xs', ys')
| toLower x == 'a' = (xs', y:ys')
| toLower y == 'a' = (x:xs', ys)
| otherwise = (x:xs', y:ys') where
(xs', ys') = filterA2 xs ys
如果您需要使用顯式遞回和模式匹配來完成,上面是使用這些方法的一種方法。當然,使用內置函式會使代碼更易于實作和閱讀,但您這樣做可能是出于教育目的。
如您所見,有 4 種基本模式,每種模式都有特定的案例,根據模式實作為守衛。關鍵思想是每個函式回傳一個由遞回函式呼叫回傳的 2 個值的元組。
filterA2 (x:xs) (y:ys) = (x:xs', y:ys') where
(xs', ys') = filterA2 xs ys
把守衛和不同的情況放在一邊,看看我們如何創建元組。所以,撇開haskell的懶惰不談,即使代碼想在每個時刻盡可能多地計算,它也無法計算函式的回傳值,除非它在堆疊下有遞回呼叫的回傳值。因此,這是如何發揮作用的,因為兩個串列都變空了,函式會沿著遞回堆疊向下移動,直到到達基本情況模式匹配的底部:
filterA2 [] [] = ([], [])
此時,最底層的函式回傳它的值,隨后它上面的函式也可以計算并回傳它的值,依此類推,直到回傳最終結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333189.html
上一篇:根據第二個字串在第一個字串中查找唯一字符,并且在java中應該沒有重復項
下一篇:子串的總和等于一個沒有匯入的數字
