我正在尝试创建一个将元组列表作为参数的函数。该函数按每个元组中的第二个元素对元组列表进行排序。我拥有的代码正在创建一种模式,该模式将仅具有一个元素的元组列表匹配。为了进行测试,我使用带有两个元素的元组列表来调用该函数,并且出现“函数中的非穷举模式”错误。
如何创建模式以匹配元组列表中的所有元素。
这是创建函数的代码。
+--------------------------------------------+
|id | col1| col2| col3| merged_cols
+--------------------------------------------+
0 | mango| man | dit | col1, col2
1 | i-man| man2 | mane | col1, col2, col3
2 | iman | mango| ho | col1, col2
3 | dim | kim | sim|
+--------------------------------------------+
sortWords :: [(String, Int)] -> [(String, Int)]
这就是我调用函数的方式。
sortWords [(str,num)] = sortBy (\x y -> compare (snd x) (snd y)) [(str,num)]
我在http://repl.it上运行程序。
答案 0 :(得分:9)
这里不需要模式匹配任何东西。只需给整个列表参数起一个名字即可。
sortWords pairs = sortBy (\x y -> compare (snd x) (snd y)) pairs
这可以进一步降低η:
sortWords = sortBy (\x y -> compare (snd x) (snd y))
模式匹配将在内部lambda中有意义:
sortWords = sortBy (\(_,x) (_,y) -> compare x y)
有一些标准的帮助器功能使其变得更加简单:
import Data.Ord (comparing)
sortWords = sortBy $ comparing snd