错误返回哈斯克尔



我在这里遇到了一些麻烦。

我正在尝试做这样的事情:

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

最新更新