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_Haskell_Non Exhaustive Patterns - Fatal编程技术网

List 哈斯凯尔-“;“非穷举模式”;使用列表的函数出错

List 哈斯凯尔-“;“非穷举模式”;使用列表的函数出错,list,haskell,non-exhaustive-patterns,List,Haskell,Non Exhaustive Patterns,我试图在haskell中创建一个函数,以了解列表中的所有元素是否具有相同的长度。(我在以前的帖子中搜索过答案,但没有一个有效) 问题是它不起作用: *Main> :l test.hs [1 of 1] Compiling Main ( test.hs, interpreted ) Ok, modules loaded: Main. *Main> sameLength [] "Empty list" *Main> sameLength [[1,2],[3,

我试图在haskell中创建一个函数,以了解列表中的所有元素是否具有相同的长度。(我在以前的帖子中搜索过答案,但没有一个有效)

问题是它不起作用:

*Main> :l test.hs
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> sameLength []
"Empty list"
*Main> sameLength [[1,2],[3,4]]
"*** Exception: test.hs:(2,1)-(5,39): Non-exhaustive patterns in function sameLength

*Main> sameLength [[1,2]]
"*** Exception: test.hs:(2,1)-(5,39): Non-exhaustive patterns in function sameLength
我真的不知道问题出在哪里。它处理参数为空列表而非空列表的情况。我错了吗?我错过什么了吗


感谢您的帮助:)

模式
[x]
与只包含一个项目的列表相匹配,
x
。因此,模式
[[items]]
匹配包含单个项的单个列表。在第二种情况下,您需要匹配所有非空列表。但由于空列表已经匹配,通过消去,您只需要匹配任何尚未匹配的内容

sameLength :: [[t]] -> String
sameLength [] = "Empty list"
sameLength items = -- Code here

这里的
[…]
太多了:

sameLength [[items]] 
(西尔维奥解释得很好)-试试看

相反

此外,作为
a==a
,您不必检查头部的长度是否与头部的长度相同(当然),因此我建议您这样做:

sameLength :: [[a]] -> Bool
sameLength []     = True
sameLength (h:tl) = all ((length h ==) . length) tl
正如我所认为的那样,
Bool
结果更有用、更自然

这是怎么回事?
all
接受一个谓词和一个列表,并检查谓词是否适用于列表中的每个元素-so
(长度h==)。length=\xs->length h==length xs
作为谓词,检查给定列表
xs
是否与头列表
h
具有相同的长度-因此,由于上面的注释,您只需使用尾列表
tl
来检查这一点

评论 您可以争论是否空列表中的所有元素都应该具有相同的长度——但我认为答案应该是肯定的;)

例子 以防您担心性能 (或者您不喜欢无点样式)


编译器不会因为引用的透明性而优化[code]长度吗?@user2682768老实说:我不知道-也许(而且tbh:我认为在大多数情况下这并不重要)-如果你愿意,你可以运行一些测试或查看核心代码(见这里:)-在任何情况下都不会有伤害(除了稍微长一点之外)我只是想添加一个非点自由(!)风格的版本,所以这一行确实更适合(而且性能听起来令人印象深刻;)@user2682768 GHC不会自动记忆函数,因为一般来说,这会占用大量内存。但是,如果您对它进行命名绑定,就像这个答案中的最后一个代码块一样,由于共享,它只会计算
长度h
一次。@davidyong感谢您指出这一点-我记得在某个地方读过类似的内容,但GHC似乎每天都变得更神奇,因此您永远无法确定;)我很确定,
length h
只会被评估一次,这不是优化问题,只是因为这是一个闭包,h不是参数,因此
length h
不会改变,只是一个thunk,因为比较,它将被评估为WHNF一次。
sameLength items 
sameLength :: [[a]] -> Bool
sameLength []     = True
sameLength (h:tl) = all ((length h ==) . length) tl
Prelude> sameLength [[1,2],[3,4]]
True
Prelude> sameLength [[1,2],[3,4,5]]
False
Prelude> sameLength [[1,2]]
True
Prelude> sameLength []
True
sameLength :: [[a]] -> Bool
sameLength []     = True
sameLength (h:tl) = let l = length h
                    in all (\xs -> length xs == l) tl