这是我的代码片段:
io f = interact (unlines . f . lines)
io (sortBy compare (read :: String -> Int))
所以我读取了这些行,得到了数值,并按它们排序。关心引导我走正确的道路?
答案 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
。使用lines
和unlines
,您可以按行分割输入和输出,因此您可以实际操作此图层。您的函数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`并且更具可读性。