Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 为什么我会得到一个;“索引太大”;例外,这里?_List_Exception_Haskell_Indexing - Fatal编程技术网

List 为什么我会得到一个;“索引太大”;例外,这里?

List 为什么我会得到一个;“索引太大”;例外,这里?,list,exception,haskell,indexing,List,Exception,Haskell,Indexing,我试着写一个返回重复元素的函数 findMul :: [String] -> String findMul [] = [] findMul s |ss!!0 == ss!!1 = ss!!0 |otherwise = findMul (tail s) where ss = sort s sort :: [String] -> [String] sort [] = [] sort (x:ys) = (sort ls) ++ [x] ++ (sor

我试着写一个返回重复元素的函数

findMul :: [String] -> String
findMul [] = []
findMul s
    |ss!!0 == ss!!1 = ss!!0
    |otherwise    = findMul (tail s)
    where
    ss = sort s

sort :: [String] -> [String]
sort [] = []
sort (x:ys) = (sort ls) ++ [x] ++ (sort gs)

    where       
    ls = [y | y<-ys, y<=x]
    gs = [y | y<-ys, y>x ]
哪个正确返回

"a"
但是当我用稍微不同的输入测试它时

findMul ["d","c","b","b","a"]
返回错误

*** Exception: Prelude.(!!): index too large

谁能解释一下这个错误是什么意思吗?以及它发生的可能原因?

您对
findMul
的模式匹配可以采用单个元素列表

findMul ["b"]
当这种情况发生时,
ss
列表的长度也为1,但您正在guard
ss!!1


这就是错误。

您对
findMul
的模式匹配可以采用单个元素列表

findMul ["b"]
当这种情况发生时,
ss
列表的长度也为1,但您正在guard
ss!!1


这是错误。

您的
排序功能正常;问题在于
findMul
函数的定义。注意第二种模式

findMul s
在案例列表
s
为非空时使用。特别是,它用于case
s
是单例列表(仅由一个元素组成的列表)

此外,列表
s
ss
总是具有相同的长度;因此,如果
s
只有一个元素,
ss
也只有一个元素

然而,在
ss!!1
,您正在尝试访问
ss
的第二个元素,如果
s
是单例列表,则该元素不存在。您实际上是在试图访问超出list
ss
实际长度(即1)的元素!这就是Haskell对你大喊大叫的原因:

*** Exception: Prelude.(!!): index too large

您的
排序
功能正常;问题在于
findMul
函数的定义。注意第二种模式

findMul s
在案例列表
s
为非空时使用。特别是,它用于case
s
是单例列表(仅由一个元素组成的列表)

此外,列表
s
ss
总是具有相同的长度;因此,如果
s
只有一个元素,
ss
也只有一个元素

然而,在
ss!!1
,您正在尝试访问
ss
的第二个元素,如果
s
是单例列表,则该元素不存在。您实际上是在试图访问超出list
ss
实际长度(即1)的元素!这就是Haskell对你大喊大叫的原因:

*** Exception: Prelude.(!!): index too large

使用
用于列表访问通常不是最好的主意。使用模式匹配,事情就会变得更清楚

findMul (x:y:rest) = if x == y then y else findMul (y:rest)  
findMul [x] = x  -- the branch you originally missed 
findMul [] = undefined -- or what you'd prefer

很明显,你只发现第一次重复。考虑完整的RLE:

< P>使用<代码>!<代码>用于列表访问通常不是最好的主意。使用模式匹配,事情就会变得更清楚

findMul (x:y:rest) = if x == y then y else findMul (y:rest)  
findMul [x] = x  -- the branch you originally missed 
findMul [] = undefined -- or what you'd prefer

很明显,你只发现第一次重复。考虑完整的RLE:

第二种模式(<代码> FIDMUL S/<代码>)用于案例列表<代码> S/<代码>有一个或多个元素;如果它只有一个元素,那么当您试图访问该列表的已排序版本(
ss!!1
)的第二个(不存在!)元素时,您会遇到麻烦……顺便说一句,这项任务可以通过以下方式轻松实现:
[head i | i 1]
第二个模式(
findMul s
)用于case list
s
有一个或多个元素;如果它只有一个元素,那么当您试图访问该列表的排序版本(
ss!!1
)的第二个(不存在!)元素时,您会遇到麻烦……顺便说一句,这个任务可以通过:
[head i | i 1]
运行长度编码轻松实现。它基本上是查找和计算字符串中所有重复的字符子序列。运行长度编码。它基本上是查找和计算字符串中所有重复的字符子序列。