2017-04-08 175 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)。這是一種將函數應用於列表中的每個元素的方法。 –