【问题标题】:Sort tuples by one of their elements in haskell按其在haskell中的元素之一对元组进行排序
【发布时间】:2015-05-21 17:36:38
【问题描述】:

我有一个这样的列表

[(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)]

【问题讨论】:

  • 忘记了import Data.List (sortBy)? (在你问之前:import Data.Function (on) 太;) - 是的,你必须做一些关于descending - hint:你可以使用flip compare
  • 另外,您可以将\(a,b)->b 替换为snd
  • 您需要在 on 周围使用反引号 (`),而不是常规撇号。
  • 好的 - 最后一部分:你必须把import 部分放在module 部分之后
  • 只是一个简单的建议/观察:我猜这里的 Int 部分是为您的指数 - 但您可以简单地通过列出它的系数来表示多项式,因此 a_0 * X^0 + a_1 * X^1 + ... + a_n * X^n 可以简单地表示为 @987654337 @ - 这样你就不必对任何东西进行排序,你可以写newtype Poly = P [float] (或者使用Num a => ... 使其更通用,使用Num a => ... 进行多项式运算) - 新类型就在那里,因为我认为你很快就会使它成为Num 的实例;)

标签: sorting haskell tuples elements


【解决方案1】:

一些观察:

  • 要获得sortByon,您必须先导入它们
  • 您想按降序排序,一种方法是使用flip compare 而不是compare
  • 您也可以使用 snd 代替 \ (a,b) -> b(感谢 Arnon)
  • `on` 必须使用反引号 ` 而不是 '(感谢 interjay)
  • 不需要mySort t = ... 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)]

【讨论】:

  • 嘿,谢谢,但是,我在头模块 TupleListPolynomial 中有这个,其中 type Poly = [(Float,Int)] import Data.List (sortBy) import Data.Function (on) 和编译器无法识别导入 D:​​无法格式化抱歉
  • 好吧,你可能不得不在 GHCi 中重复它;)(如果没有看到你的实际代码和你真正做了什么,真的很难说)
  • 顺便说一句:导入通常在任何定义之前(也许你可以添加你的实际代码和你的编译器错误) - 但是我在 *in GHCi 你会写的部分写的对我有用,他们也应该对你有用
  • 呃,我已经编辑了主帖以获得对编译错误的更多见解和实际解释
  • @dari1495 我在那里给你留下了评论 - 我也会为此编辑我的答案
猜你喜欢
  • 2019-06-24
  • 2015-06-21
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2015-10-18
相关资源
最近更新 更多