Haskell模式匹配-非穷举模式-但为什么?
我正在尝试在Haskell中创建一个运行长度编码函数。 我知道有很多例子,我不是真的在寻找一个解决方案,而是更多的解释为什么我的不起作用Haskell模式匹配-非穷举模式-但为什么?,haskell,exception,pattern-matching,Haskell,Exception,Pattern Matching,我正在尝试在Haskell中创建一个运行长度编码函数。 我知道有很多例子,我不是真的在寻找一个解决方案,而是更多的解释为什么我的不起作用 rle[]s acc=acc rle(x:xs)s acc=rle xs s((x,计数x s):acc) 计数x=长度。过滤器(x==) 由于某些原因,Haskell无法匹配此模式。 e、 g.rle“abcd”“aaa”[应返回[('a',3),('b',0),…],但始终会导致非穷举模式异常 我是否遗漏了一些明显的内容?我假设您在ghci中定义了这一点
rle[]s acc=acc
rle(x:xs)s acc=rle xs s((x,计数x s):acc)
计数x=长度。过滤器(x==)
由于某些原因,Haskell无法匹配此模式。
e、 g.rle“abcd”“aaa”[
应返回[('a',3),('b',0),…]
,但始终会导致非穷举模式异常
我是否遗漏了一些明显的内容?我假设您在
ghci
中定义了这一点。如果您编写的函数跨越多行,那么应该用:{
和:}
将它们包围起来。如果不这样做,则定义两个函数rle
。第二个将在本地范围更广,因此如果您稍后调用rle
,它将选择那个
例如:
$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/kommusoft/.ghci
Prelude> :{
Prelude| rle [] s acc = acc
Prelude| rle (x:xs) s acc = rle xs s ((x, count x s) : acc)
Prelude|
Prelude| count x = length . filter (x==)
Prelude| :}
Prelude> rle "abcd" "aaa" []
[('d',0),('c',0),('b',0),('a',3)]
但是,使用
count
在这里不起作用,因为您的rle
每次都会在列表中执行一步。此外,您在这里不需要使用累加器。这就是您在ghci
中定义累加器的方式吗?如果您编写多行函数,则应使用:{
和:}
围绕这些函数。但是请注意,这里您不会生成运行长度编码。啊,谢谢,我现在明白为什么它不起作用了。也谢谢你的提示:{:}