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,但您正在guardss!!1
这就是错误。您对
findMul
的模式匹配可以采用单个元素列表
findMul ["b"]
当这种情况发生时,ss
列表的长度也为1,但您正在guardss!!1
这是错误。您的
排序功能正常;问题在于findMul
函数的定义。注意第二种模式
findMul s
在案例列表s
为非空时使用。特别是,它用于cases
是单例列表(仅由一个元素组成的列表)
此外,列表s
和ss
总是具有相同的长度;因此,如果s
只有一个元素,ss
也只有一个元素
然而,在ss!!1
,您正在尝试访问ss
的第二个元素,如果s
是单例列表,则该元素不存在。您实际上是在试图访问超出listss
实际长度(即1)的元素!这就是Haskell对你大喊大叫的原因:
*** Exception: Prelude.(!!): index too large
您的排序
功能正常;问题在于findMul
函数的定义。注意第二种模式
findMul s
在案例列表s
为非空时使用。特别是,它用于cases
是单例列表(仅由一个元素组成的列表)
此外,列表s
和ss
总是具有相同的长度;因此,如果s
只有一个元素,ss
也只有一个元素
然而,在ss!!1
,您正在尝试访问ss
的第二个元素,如果s
是单例列表,则该元素不存在。您实际上是在试图访问超出listss
实际长度(即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 lists
有一个或多个元素;如果它只有一个元素,那么当您试图访问该列表的排序版本(ss!!1
)的第二个(不存在!)元素时,您会遇到麻烦……顺便说一句,这个任务可以通过:[head i | i 1]
运行长度编码轻松实现。它基本上是查找和计算字符串中所有重复的字符子序列。运行长度编码。它基本上是查找和计算字符串中所有重复的字符子序列。