2017-04-08 142 views
-5

我在这里有一些麻烦。错误返回Haskell

我试图做这样的事情:

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中,i'ts回报:

prelude> elimLetras "abacate" 
output: "cce" 

任何提示吗?

+2

如果它不起作用,请告诉我们它是如何工作的。 “工作不正常”并不能帮助我们帮助你。 –

+1

我想从例子和你写的代码中猜测,你想以不区分大小写的方式删除子字符串'aba'(而不是你写的'abc')。是对的吗? –

+1

对不起,我要编辑这个。 – Hira22

回答

1

因此,您试图从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 
+0

它的工作!非常感谢你。 – Hira22

+0

请再提一个问题。如果我想把这样的话放在这样的数组上: 前奏> elimLetras [“abacate”,“aba”,“baaaba”] 我该怎么办? – Hira22

+0

这就是'map'功能派上用场的地方。如果你以前从未遇到过,那么你应该了解它。这是一个更高阶的函数,你可以在这里了解更多(http://learnyouahaskell.com/higher-order-functions)。这是一种将函数应用于列表中的每个元素的方法。 –