У меня есть список [(String, [String], IO Int)]
, который я бы хотел сортировать. sortBy (\x -> ...) list
требует от IO использовать внутреннее значение IO Int
, что означает, что я не могу вернуть Ordering
, но только IO Ordering
в функцию sortBy
. Есть ли способ отсортировать список?Как отсортировать список на основе значения IO Int
ответ
Третий элемент каждого кортежа - IO Int
, поэтому его значение зависит от внешнего мира. Так что заказать отсортированного списка зависит от внешнего мира. Нет, нет способа сделать [(String, [String], IO Int)]
, который сортируется по значению IO Int
.
Что вы можете сделать, это значение IO [(String, [String], Int)]
, а затем поднимите sortBy
функцию вIO
монады, чтобы дать вам еще IO [(String, [String], Int)]
, что позволит получить список отсортированных по Int
. Это не чистый список, но вы можете ввести любую другую чистую функцию в монаду IO
, чтобы делать на ней произвольные чистые вычисления.
Что-то, как это будет делать:
import Control.Applicative
import Data.List
l :: [(String, [String], IO Int)]
l = [("Foo", [], return 2), ("Bar", [], return 1)]
f :: Monad m => (a, b, m c) -> m (a, b, c)
f (x, y, ioz) = ioz >>= \z -> return (x, y, z)
sl = sortBy (\(x, y, z) (x', y', z') -> compare z z') <$> mapM f l
Я должен упомянуть, так как это может быть не очевидно, что это будет запускать IO Int
действия в том порядке, в котором они появились в списке изначально. Но чтобы отсортировать их, вы должны запустить их, чтобы получить значения Int
, и их нужно запустить в примерно.
Этот подъем монады был именно тем, что мне нужно, спасибо. – Witiko
@Witiko Как правило, я стараюсь программировать в Haskell. Напишите все вычисления как чистые функции. В какой-то момент ваши вычисления зависят от значений «IO», но вы пытаетесь поднять чистые функции в монаду «IO», чтобы выполнить всю реальную работу как можно скорее. Это означает, что вы делаете большую часть своей работы, как будто 'IO' не существует, и даже когда вы пишете код« IO », вы, надеюсь, просто снимаете чистые функции и проводя результаты, а не повторно реализуете 'IO' версии вещей. – Ben
- 1. Python, как отсортировать список на основе суммы
- 2. Как отсортировать массив на основе значения ключа?
- 3. Как отсортировать ArrayList на основе значения переменных
- 4. Как отсортировать массив на основе значения
- 5. Хотите отсортировать ArrayList на основе значения атрибута
- 6. Как я могу заказать список слов <int, string> на основе значения словаря int?
- 7. Как отсортировать общий список на основе пользовательского атрибута?
- 8. Как отсортировать список в C#?
- 9. Как отсортировать список объектов на основе их свойств?
- 10. Как отсортировать список меток на основе текста меток? JavaFX
- 11. Как отсортировать список ссылок?
- 12. Как отсортировать на основе заказа
- 13. Как отсортировать список объектов на основе целочисленной переменной в Java
- 14. Как отсортировать результаты MySQL на основе определенного иностранного значения?
- 15. Динамический градиентный фон на основе значения int
- 16. Как отсортировать список объектов
- 17. Как отсортировать список словарей?
- 18. Компактный список на основе значения
- 19. Как отсортировать список списка на основе двух элементов, в Python?
- 20. Как отсортировать список на основе соединения с другой таблицей
- 21. Как отсортировать список строки на основе пользовательской логики в Java
- 22. Как отсортировать список, содержащий namedtuples, на основе различия между атрибутами?
- 23. В Sharepoint, как я могу отсортировать список на основе гиперссылки?
- 24. C#: Как отсортировать список объектов, на основе списка строки
- 25. Список сортировки на основе значения индекса
- 26. Как отсортировать список интерфейса
- 27. Как отсортировать список массивов?
- 28. Как отсортировать treemap на основе его значений?
- 29. Преобразование IO Int в Int
- 30. Как создать список на основе максимального значения?
Если ваша функция сравнения находится в 'IO', это означает, что сравнение может меняться каждый раз, когда вы это делаете. Как вы можете отсортировать список, если не можете воспроизводить два элемента? –
Я думаю, что мы говорим здесь абстрактно. Как вы будете делать то, что хотите делать на обычном языке, таком как Python или Java или Javascript? – ErikR
Почему вы не можете запустить действие «IO», получить «Int», а затем отсортировать список? Вы действительно хотите получить потенциально различный 'Int' каждый раз, когда вы сравниваете элемент списка? –