juan_gandhi: (Default)
Juan-Carlos Gandhi ([personal profile] juan_gandhi) wrote2012-07-02 12:24 pm
Entry tags:

наука и жизнь

Scala:
  scala> List(Set(1,2)).flatten == List(Set(2,1)).flatten
res3: Boolean = false


Бля.

[identity profile] sassa-nf.livejournal.com 2012-07-03 08:02 pm (UTC)(link)
ну да, но теперь же это самое интересное :)

import qualified Data.IntMap as I
import qualified Data.Set as S
...
insert :: (Hashable a, Ord a) => a -> HashSet a -> HashSet a
insert a (HashSet s) = HashSet $
  I.insertWith (\_ -> S.insert a) (hash a) (S.singleton a) s
по ключу (hash a) нашли существующее значение и скомбинировали его с новым: (S.insert a). Поскольку S.insert==Set.insert, то должно быть отсортировано. quickcheck что, к разным типам привёл два списка?

[identity profile] nponeccop.livejournal.com 2012-07-04 04:54 am (UTC)(link)
> quickcheck что, к разным типам привёл два списка?

Это исключено, т.к. (==) :: Eq a => a -> a -> Bool, а не (Eq a, Eq b) => a -> b -> Bool, т.е. сравнению требуется 2 одинаковых типа.

Вы на toList и fromList посмотрите. Как происходит вставка одного элемента - иррелевантно, т.к. пример её не использует.

[identity profile] sassa-nf.livejournal.com 2012-07-04 07:27 am (UTC)(link)
ну, посмотрю. я думал, дложно было быть consistent с поэлементной вставкой.

[identity profile] nponeccop.livejournal.com 2012-07-04 07:38 am (UTC)(link)
в документации порядок не гарантируется. Соответственно, и консистентность.

[identity profile] sassa-nf.livejournal.com 2012-07-04 07:39 am (UTC)(link)
говорят, используется:

fromList :: (Hashable a, Ord a) => [a] -> HashSet a
fromList xs = foldl' (flip insert) empty xs


да, я понимаю насчёт Eq, но как ещё объяснить разницу. Если бы объекты были одинаковы, то insert выполнился бы одинаково.

Мне доустановить ещё чё-то там надо. А то бы просто глянуть на fromList одного и другого.