Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell模式匹配-非穷举模式-但为什么?_Haskell_Exception_Pattern Matching - Fatal编程技术网

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中定义了这一点

我正在尝试在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
。第二个将在本地范围更广,因此如果您稍后调用
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
中定义累加器的方式吗?如果您编写多行函数,则应使用
:{
:}
围绕这些函数。但是请注意,这里您不会生成运行长度编码。啊,谢谢,我现在明白为什么它不起作用了。也谢谢你的提示:{:}