【发布时间】:2019-04-04 03:33:51
【问题描述】:
我试图在 Haskell wiki 上解决这个问题:https://wiki.haskell.org/99_questions/11_to_20(问题 12)
我的解决方法如下:
data Repeats a = Single a | Multiple Int a deriving Show
encodelens :: Eq a => [a] -> [Repeats a]
encodelens xs = foldr (\x acc -> case acc of
[] -> [Single x]
(l:ls) -> case l of
(Single x') -> if x == x'
then [(Multiple 2 x)] ++ ls
else [(Single x)] ++ (l:ls)
(Multiple c x') -> if x == x'
then [(Multiple (c+1) x)] ++ ls
else [(Single x)] ++ (l:ls)
) [] xs
decodelens :: Eq a => [Repeats a] -> [a]
decodelens [] = []
deocdelens (r:rs) = case r of
(Single x) -> [x] ++ decodelens rs
(Multiple c x) -> take c (repeat x) ++ decodelens rs
decodelens 不起作用,它失败了:
decodelens [Multiple 4 'a',Multiple 2 'b',Multiple 2 'c',Multiple 2 'd',Single 'e',Multiple 3 'f']
"*** Exception: encode-len-with-cardinality.hs:(17,1)-(19,47): Non-exhaustive patterns in function decodelens
我不确定它是如何无法进行模式匹配的。
更新:
正如下面 cmets 所指出的,错误在于第二个模式匹配 deocdelens 的函数名。 不知道有没有办法避免这样的错误?
【问题讨论】:
-
看函数名的拼写:deocde vs. decode。
-
该死,这么简单的错误。有没有办法避免这样的错误?
-
我们都会犯这样的错误,这就是为什么 ghc 是一个很棒的结对编程合作伙伴。
-
@Ngm 是的,有一种方法——使用
-Wall开启警告! GHC 应该警告您 1) 非详尽匹配和 2) 函数deocde开始定义时没有类型注释deocde :: ...。第二个应该指出问题。