如何创建一个模式以匹配元组列表中的所有元素?

时间:2019-01-11 00:36:31

标签: haskell tuples

我正在尝试创建一个将元组列表作为参数的函数。该函数按每个元组中的第二个元素对元组列表进行排序。我拥有的代码正在创建一种模式,该模式将仅具有一个元素的元组列表匹配。为了进行测试,我使用带有两个元素的元组列表来调用该函数,并且出现“函数中的非穷举模式”错误。

如何创建模式以匹配元组列表中的所有元素。

这是创建函数的代码。

+--------------------------------------------+ |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上运行程序。

1 个答案:

答案 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