我有一個[(String, [String], IO Int)]
列表,我想對它進行排序。 sortBy (\x -> ...) list
需要我使用IO來獲取IO Int
的內部值,這意味着我不能返回Ordering
,而只能使用IO Ordering
來獲取sortBy
函數。有什麼方法可以對列表進行排序嗎?如何根據IO Int值對列表進行排序
2
A
回答
7
每個元組的第三個元素是IO Int
,所以它的值取決於外部世界。因此,排序列表的訂單取決於外部世界。所以不,沒有辦法做一個[(String, [String], IO Int)]
這是排序的值IO Int
。
什麼你可以做的是使IO [(String, [String], Int)]
的值,然後提起sortBy
功能到的IO
單子給你另一個IO [(String, [String], Int)]
,將產生由Int
排序的列表。這不是一個純粹的列表,但是您可以將任何其他純函數注入到monod中,以對其執行任意純計算。
像這樣的事:
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
,並且它們必須在的某些順序中運行。
相關問題
- 1. 如何根據另一個列表對列表進行排序?
- 2. 如何根據對象的屬性對列表進行排序
- 3. 如何根據列對數組列表進行排序?
- 4. 如何根據子列表中的值對列表進行排序?
- 5. 使用int值對散列表進行ArrayList排序
- 6. 如何根據列值對numpy數組進行排序?
- 7. 如何根據三個要求對列表進行排序?
- 8. 如何根據django中的計數對列表進行排序?
- 9. 如何根據字符串對列表進行排序?
- 10. Android:如何根據日期對列表項目進行排序
- 11. 如何根據輪廓(x,y)對MatOfPoints列表進行排序
- 12. 試圖根據字符串值對列表進行排序
- 13. Java 1.6:根據模型值對模型列表進行排序
- 14. 根據列值對錶格進行排序
- 15. 如何根據相對日期值對字典列表進行排序?
- 16. 如何根據列表中的值以降序對字典進行排序?
- 17. 如何根據python中的列表列表對列表進行排序?
- 18. 根據另一個列表值對列表的索引值進行排序
- 19. 根據運行時屬性對對象列表進行排序
- 20. 如何根據值以降序對TreeMap進行排序
- 21. 如何根據其他陣列對陣列進行排序
- 22. 如何根據一些標準對groovy列表值進行排序
- 23. 如何根據多列對flex數據網格進行排序?
- 24. 如何根據其中一列對行進行排序?
- 25. 如何根據MySQL中的兩列對行進行排序?
- 26. 根據列值對分層SQL行進行排序
- 27. scala根據對象參數錯誤對列表進行排序
- 28. 根據內部表值對lua中的表進行排序
- 29. 如何對DataTable列值進行排序?
- 30. 根據日期列對數據表進行排序(dd MMM yyyy)
如果您的比較函數在'IO'中,那意味着每次執行比較都會發生變化。如果你無法可重複地比較兩個元素,你如何排序列表? – 2013-04-25 00:49:47
我想我們在這裏抽象地談論。你如何做像Python或Java或Javascript這樣的傳統語言? – ErikR 2013-04-25 00:53:45
爲什麼不能運行'IO'動作,獲取'Int',然後對列表進行排序?每次你比較列表的一個元素時,你真的想要獲得一個可能不同的'Int'嗎? – 2013-04-25 00:56:59