我在这里遇到了一些麻烦。
我正在尝试做这样的事情:
Prelude> func ["abacate", "aba", "baaba"]
["cate", "", "ba"]
此练习必须返回不带子字符串aba
的单词。
elimLetras :: String -> String
elimLetras [] = []
elimLetras (x:y:z:xs)
| elem x "aA" || elem y "bB" || elem z "aA" = elimLetras xs
| otherwise = x : elimLetras (x:xs)
| otherwise = y : elimLetras (y:xs)
| otherwise = z : elimLetras (z:xs)
elimLetras (x:xs) = x:xs
此代码无法正常工作。
在ghci上,我不会返回:
prelude> elimLetras "abacate"
output: "cce"
有什么提示吗?
因此,
您正在尝试从String
中删除不区分大小写的子字符串aba
。检查子字符串的方法还不错。它不会很好地扩展,但如果你愿意,你可以保持这样。主要问题是多个otherwise
语句。你应该只有一个otherwise
语句,因为只有第一个语句才能到达。
以下是使用几个辅助函数重写的函数:
import Data.Char (toLower)
elimLetras :: String -> String
elimLetras (x:y:z:xs)
| stringEquals "aba" [x,y,z] = elimLetras xs
| otherwise = x : elimLetras (y:z:xs)
elimLetras xs = xs -- anything that has fewer than 3 letters is returned "as is".
-- Check if two strings are the same (case insensitive)
stringEquals :: String -> String -> Bool
stringEquals a b = stringToLower a == stringToLower b
stringToLower :: String -> String
stringToLower [] = []
stringToLower (x:xs) = toLower x : stringToLower xs
如果你知道map
函数,以下是我可能会怎么写的:
elimLetras' :: String -> String
elimLetras' (x:y:z:xs)
| "aba" == map toLower [x,y,z] = elimLetras' xs
| otherwise = x : elimLetras' (y:z:xs)
elimLetras' xs = xs