#haskell #io
#haskell #io
Вопрос:
вот отрывок из моего кода:
io f = interact (unlines . f . lines)
io (sortBy compare (read :: String -> Int))
итак, я читаю строки, получаю числовое значение и сортирую по ним. Не могли бы направить меня по правильному пути?
Ответ №1:
Вам нужно использовать comparing
из Data.Ord
модуля вместо compare
:
import Data.Ord
import Data.List
io f = interact (unlines . f . lines)
main = io (sortBy (comparing (read :: String -> Int)))
Ответ №2:
Возможно, я не совсем понимаю ваш вопрос, но вот как я его получил:
Функция interact
передает входные данные из stdin
в вашу программу и помещает результат в stdout
. Используя lines
и unlines
, вы получаете разделение ввода и вывода по строкам, так что вы действительно можете работать на этом уровне. Ваша функция io
теперь не делает ничего другого, кроме помещения функции f
в эту структуру.
Далее, sortBy compare
это не что иное, как sort
. Таким образом, вы в основном преобразуете строки в числа и сортируете их таким образом. Результатом является список чисел. Возможно, вы заметили, что ваша программа не выполняет проверку ввода на этом этапе, поскольку unlines
ожидает a [String]
, а не a [Int]
для ввода. Измените свою функцию на map show $ sort (read :: String -> Int)
, чтобы исправить это. На самом деле я бы написал map show $ sort (asTypeOf 0 . read) instead, making it an
Integer instead of an
Int` и более читабельно.
Комментарии:
1. Спасибо за вашу помощь. Прошу прощения за двусмысленность — то, что я пытаюсь сделать, это сравнить строку численно, а не лексикографически. Надеюсь, это поможет вашему ответу
2. @Sam P: В этом случае просто поставьте
map show
перед последней строкой. Ваш код уже сравнивается численно, но он не проверяет тип. Пожалуйста, обратите внимание, что ваш код вообще не является программой. В реальной программе на Haskell поместите код, который должен выполняться, в вызываемую функциюmain
.3. Да, на самом деле есть много кода, который я вырезал, чтобы получить объективный ответ. кажется, что map show (io ( sort (asTypeOf 0 . читать))) не работает… Все еще есть несоответствие типов
4. Вместо этого @Sam P напишите
io . map show . sort $ read :: String -> Int))
. Аргументio
должен быть типа[String] -> [String]
, но ваш(sortBy compare (read :: String -> Int))
имеет тип[String] -> [Int]
. Вот где возникает несоответствие.5. все еще ошибка, извините! Ожидаемый тип: [a0] -> [String] -> [String] Фактический тип: [a0] -> [b0]