我是一名有用的助手,可以翻译文本。
我正在学习learn you a haskell教程,并且在作者提供的一些示例中遇到了一些问题。
例如,他将zip重新实现如下:
他在所有其他示例中使用相似的方法,即将最具体的模式放在最前面。这是zip函数的稍微不同的版本:
据我所知,这两种方法都是做同样的事情。如果提供了一个空列表,无论是(x:xs)还是(y:ys),都不会匹配,这将通过附加空列表[]来完成递归。
1. 我个人更喜欢第二个版本,因为它更易读,但也许我这么做是错的。 2. 它对方法的性能有任何影响吗?据我所知,如果顶部模式不匹配,Haskell 将检查下一个模式。模式的顺序是否影响性能?
此致敬礼,
编辑: 可能是重复的: Haskell GHC: what is the time complexity of a pattern match with N constructors? 总结:模式的顺序对语义(关于参数的严格评估)和函数的可读性非常重要。模式匹配本身总是在O(1)时间复杂度内完成。
我正在学习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),都不会匹配,这将通过附加空列表[]来完成递归。
1. 我个人更喜欢第二个版本,因为它更易读,但也许我这么做是错的。 2. 它对方法的性能有任何影响吗?据我所知,如果顶部模式不匹配,Haskell 将检查下一个模式。模式的顺序是否影响性能?
此致敬礼,
编辑: 可能是重复的: Haskell GHC: what is the time complexity of a pattern match with N constructors? 总结:模式的顺序对语义(关于参数的严格评估)和函数的可读性非常重要。模式匹配本身总是在O(1)时间复杂度内完成。