2017-02-09 64 views
0

我试图来解决HackerRank一个简单的问题,并在标题我收到错误。我是一个Haskell noob,与我一起裸露。该问题要求采取一个字符串,并通过删除相邻的字母来减少字符串。例如“aabcdd”=>“bc”。这里是我的代码:Haskell字符串操作。功能错误中的非穷举模式。

main :: IO() 
main = do 
    line <- getLine 
    putStrLn (reduce' line) 

reduce' :: String -> String 
reduce' [] = [] 
reduce' (x0:x1:xs) 
    | x1:xs == [] = [x0] 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

我很困惑,因为我想我已经覆盖的边缘情况。我不想要问题的答案,我只想知道为什么我会收到错误。谢谢!

+0

它已经一段时间,因为我写的哈斯克尔,但IIRC,你最后的情况下,将只匹配正好3个字符。如果字符串有1或2个元素,它将不匹配。 – Carcigenicate

+0

@Carcigenicate:没有两个元素'xs'是列表的尾部。 –

+0

@WillemVanOnsem哦对。所以只有1个元素。 – Carcigenicate

回答

4

你不配套,你在列表中

reduce' :: String -> String 
reduce' [] = [] 
reduce' [x] = [x] 
reduce' (x0:x1:xs) 
    | x0 == x1 = reduce' xs 
    | otherwise = x0 : x1 : reduce' xs 

| x1:xs == [] = [x0]只有一个元素为匹配添加的模式,所以没有必要在警卫检查。

+0

就是这样!谢谢。 – Outis

+1

请注意,前两种情况一起可以写成一个'reduce'x = x',如果你把*放在* x0:x1:xs'的情况之后。 – chepner