В теории, нет
Там нет языковых расширений, которые позволяют для «установить постижения.»
Различия между Set
и List
являются:
Set
является неупорядоченным, а List
заказана
- элементы
Set
являются уникальными в то время как List
могут иметь повторяющиеся элементы
- тип
Set
является примером Ord
, в то время как у List
нет ограничений по типу.
Вы можете видеть, что все возможные Set
s являются строгим подмножеством всех возможных List
. Это означает, что мы можем достичь «установленного понимания», просто используем понимание списка и преобразовывая его в Set
. Ленивая оценка будет часто сделать "set generation" эффективной исходя из самых конечных списков. Однако перечни, приводящие к спискам бесконечных, вряд ли приведут к эффективному «установлению понимания».
Пример:
import Data.Set
set :: Ord a => Set a
set = fromList [x * y | x <- [1..10], y <- [1..10]]
В практике, да
Используя set-monad
пакет, вы можете определить Set
как экземпляр Monad
и с помощью расширения MonadComprehensions
языка вы можете получить «набор понимание».
Пример:
{-# LANGUAGE MonadComprehensions #-}
import Data.Set.Monad
set1 :: Set (Int,Int)
set1 = do
a <- fromList [1 .. 4]
b <- fromList [1 .. 4]
return (a,b)
-- Look a "set comprehension"
set2 :: Set (Int,Int)
set2 = [ (a,b) | (a,b) <- set1, even a, even b ]
Используйте тот метод, который имеет наибольший смысл для вашего проекта. Перед тем как принять решение!
«множества - это математическая структура, которая вдохновила на понимание списков». Но Data.Set не является такой структурой 'из-за ограничения Ord'. –