错误返回Haskell

错误返回Haskell,haskell,Haskell,我在这里遇到了一些麻烦 我正试着这样做: Prelude> func ["abacate", "aba", "baaba"] ["cate", "", "ba"] 此练习必须返回不带子字符串aba的单词 这段代码不正常 关于ghci,我的回报是: prelude> elimLetras "abacate" output: "cce" 有什么建议吗 因此您试图从字符串中删除不区分大小写的子字符串aba。检查子字符串的方法不错。它的伸缩性不是很好,但如果你想的话,可以保持这样。主

我在这里遇到了一些麻烦

我正试着这样做:

Prelude> func ["abacate", "aba", "baaba"]
["cate", "", "ba"]
此练习必须返回不带子字符串aba的单词

这段代码不正常

关于ghci,我的回报是:

prelude> elimLetras "abacate" 
output: "cce" 

有什么建议吗

因此您试图从字符串中删除不区分大小写的子字符串aba。检查子字符串的方法不错。它的伸缩性不是很好,但如果你想的话,可以保持这样。主要问题在于多个否则的语句。您应该只有一个否则的语句,因为只有第一个语句才能到达

以下是使用两个辅助函数对函数的重写:

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

如果它不起作用,告诉我们它是如何起作用的。它不能正常工作,也不能帮助我们帮助您。我将从示例和您编写的代码中猜测,您希望删除子字符串aba,而不是您以不区分大小写的方式编写的abc。是吗?是的,对不起,我要编辑这个。请再问一个问题。如果我想把这些词放在这样的数组中:prelude>elimLetras[abacate,aba,baaaba]我应该怎么做?这就是map函数的用武之地。如果你以前从未见过它,你应该了解它。这是一个高阶函数,你可以了解更多。这是一种将函数应用于列表中每个元素的方法。谢谢Henry!我这样做了:序曲>地图Elimletra[abacate,aba,baab]和它的作品!
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