通过haskell中的一个元素对元组进行排序

时间:2015-05-21 17:36:39

标签: sorting haskell tuples elements

我有一个像这样的列表

[(1,2),(2,1),(3,3)]

我想用第二个元素对它进行排序,所以它是:

[(3,3),(1,2),(2,1)]

我已经尝试了

mySort t = sortBy (compare `on` (\(a,b)->b)) t

但是ghci显然不认识sortBy

好的,编辑:

我使用GHCi编译实际的.hs文件,所以我得到了我的标题:

import Data.List (sortBy)
import Data.Function (on)

module TupleListPolynomial where
type Poly = [(Float,Int)]

如果我这样写,编译器就不会识别'模块'(使用:l和:r btw):

[1 of 1] Compiling Main             ( TupleListPolynomial.hs, interpreted )

TupleListPolynomial.hs:5:1: parse error on input ‘module’

如果我翻转它并写下面的导入品,它就不会认识到导入'同样的错误。

编辑:解决这个问题:

module TupleListPolynomial where
import Data.List (sortBy)
import Data.Function (on)
type Poly = [(Float,Int)]

1 个答案:

答案 0 :(得分:10)

一些观察结果:

  • 要获取sortByon,您必须先导入它们
  • 您希望按降序排序,一种方法是使用flip compare代替compare
  • 而不是\ (a,b) -> b您也可以使用snd(感谢Arnon)
  • 您必须使用`代替'代替`on`(感谢interjay)
  • tmySort t = ... t不需要

一种可能的解决方案:

好的 - 如果你把它放到某个myPolynomial.hs文件中(或者你想要调用它),这个应该编译并加载并运行到ghci:

module TupleListPolynomial where

import Data.List (sortBy)
import Data.Function (on)

type Poly = [(Float,Int)]

mySort :: Ord b => [(a, b)] -> [(a, b)]
mySort = sortBy (flip compare `on` snd)
在GHCi中

你会写

import Data.List (sortBy)
import Data.Function (on)

let mySort = sortBy (flip compare `on` snd)
实际上,这就是我这样做的测试方法:

测试

> mySort [(1,2),(2,1),(3,3)]
[(3,3),(1,2),(2,1)]