sortBy и interact работают вместе во взаимном сотрудничестве?

#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]