sortBy和互动合作相互合作?

时间:2011-06-13 11:53:23

标签: haskell io

这是我的代码片段:

io f = interact (unlines . f . lines)

io (sortBy compare (read :: String -> Int))

所以我读取了这些行,得到了数值,并按它们排序。关心引导我走正确的道路?

2 个答案:

答案 0 :(得分:4)

您需要使用comparing模块中的Data.Ord而不是compare

import Data.Ord
import Data.List

io f = interact (unlines . f . lines)
main = io (sortBy (comparing (read :: String -> Int)))

答案 1 :(得分:1)

也许我真的不明白你的问题,但这就是我得到它的方式:

函数interact将来自stdin的输入反馈到您的程序中,并将结果放到stdout。使用linesunlines,您可以按行分割输入和输出,因此您可以实际操作此图层。您的函数io现在不执行任何操作,然后将函数f放入此框架中。

接下来,sortBy compare只不过是sort。所以你基本上将行转换为数字并以这种方式对它们进行排序。结果是一个数字列表。您可能已经注意到,此时您的程序未能进行类型检查,因为unlines期望输入为[String]而不是[Int]。将您的功能更改为map show $ sort (read :: String -> Int)以解决此问题。我实际上会写map show $ sort (asTypeOf 0 . read) instead, making it an Integer instead of an Int`并且更具可读性。