【发布时间】:2016-05-16 15:45:30
【问题描述】:
我正在阅读learn you a haskell 教程和 我一直在绊倒作者的一些例子 已经给了。
例如他重新实现了 zip 如下:
zip' :: [a] -> [b] -> [(a,b)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys
他对所有其他示例都使用了类似的方法, 他把最具体的模式放在首位。这是一个略有不同的 zip函数的版本:
zip' :: [a] -> [b] -> [(a,b)]
zip' (x:xs) (y:ys) = (x, y):zip' xs ys
zip' _ _ = []
据我了解,这两种方法都做同样的事情。如果 以 (x:xs) 或 (y:ys) 的方式提供一个空列表 将不匹配哪个将通过附加来完成递归 空列表 []。
- 我个人更喜欢第二个版本的可读性,但也许我这样做是错误的。
- 它对方法的性能有任何影响吗?据我了解,如果最上面的模式不匹配,Haskell 将检查下一个模式。模式的顺序会影响性能吗?
亲切的问候,
编辑:
可能重复: Haskell GHC: what is the time complexity of a pattern match with N constructors?
总结:模式的顺序对于语义(就参数的严格评估而言)和函数的可读性而言非常重要。模式匹配本身的时间复杂度总是 O(1)。
【问题讨论】: