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

dar*_*495 4 sorting haskell tuples elements

我有这样的清单

[(1,2),(2,1),(3,3)]
Run Code Online (Sandbox Code Playgroud)

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

[(3,3),(1,2),(2,1)]
Run Code Online (Sandbox Code Playgroud)

我试过了

mySort t = sortBy (compare `on` (\(a,b)->b)) t
Run Code Online (Sandbox Code Playgroud)

但ghci显然没有认识到

好的,编辑:

我正在使用GHCi编译实际的.hs文件,所以我有我的标题:

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

module TupleListPolynomial where
type Poly = [(Float,Int)]
Run Code Online (Sandbox Code Playgroud)

如果我这样写,编译器将无法识别'module'(使用:l和:r btw):

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

TupleListPolynomial.hs:5:1: parse error on input ‘module’
Run Code Online (Sandbox Code Playgroud)

如果我翻转它并写下面的导入它将无法识别具有相同错误的'import'.

编辑:通过这样解决:

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

Car*_*ten 11

一些观察:

  • 获得sortBy,on你必须先导入它们
  • 你想按降序排序,一种方法是使用flip compare而不是compare
  • 而不是\ (a,b) -> b你也可以使用snd(感谢Arnon)
  • 你必须使用反单引号`,而不是'为`on`(感谢interjay)
  • 将t在mySort t = ... t不需要

一种可能的方案:

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

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)
Run Code Online (Sandbox Code Playgroud)

在GHCi你会写

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

let mySort = sortBy (flip compare `on` snd)
Run Code Online (Sandbox Code Playgroud)

事实上这就是我做的测试方式:

测试

> mySort [(1,2),(2,1),(3,3)]
[(3,3),(1,2),(2,1)]
Run Code Online (Sandbox Code Playgroud)