Juan-Carlos Gandhi (
juan_gandhi) wrote2012-07-02 12:24 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
наука и жизнь
Scala:
Бля.
scala> List(Set(1,2)).flatten == List(Set(2,1)).flatten res3: Boolean = false
Бля.
no subject
http://ivan-gandhi.livejournal.com/2019207.html?thread=24711559#t24711559 - такой пример не существует? разве только по умолчанию в хаскеле это SortedSet.
no subject
no subject
two100 points?А можно одновременно выдать значение хэша, используемого этими сетами? И можно найти две значения, которые дают одинаковый хэш, а потом попытаться создать сеты из этих значений?
no subject
http://hackage.haskell.org/packages/archive/hashmap/1.0.0.2/doc/html/Data-HashSet.html
no subject
no subject
no subject
занятная конструкция IntMap, нужно ещё почитать.
no subject
no subject
hash 4 == hash 4 + 2 ^ 39
Но для Data.Set (который требует порядка) всё как положено.
no subject
chem Data.HashSet luchshe chem Data.Set?
v kakih takih cluchajah pol'zujut? nabor funcij vrode odin i tot zhe
===========================
P.S.
ksta, otkompilit' vash primer ne daet:
i vot, v ghci:
*Main> :r
[1 of 1] Compiling Main ( sets1.hs, interpreted )
sets1.hs:54:15:
Ambiguous type variable `a0' in the constraints:
(Data.Hashable.Hashable a0) arising from a use of `H.fromList'
at sets1.hs:54:15-24
(Num a0) arising from the literal `4' at sets1.hs:54:39
(Eq a0) arising from a use of `H.fromList' at sets1.hs:54:15-24
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `($)', namely
`H.fromList [4 + 2 ^ 39, 4]'
In the second argument of `(==)', namely
`(H.toList $ H.fromList [4 + 2 ^ 39, 4])'
In the expression:
(H.toList $ H.fromList [4, 4 + 2 ^ 39])
==
(H.toList $ H.fromList [4 + 2 ^ 39, 4])
Failed, modules loaded: none.
===================================
P.P.S.
a vot esli tak, to compilitsa, no rezul'tat : true
no subject
В GHCi действуют другие правила для тайпчекера, поэтому если я набираю в промпте
toList (fromList [4, 4 + 2 ^ 39]) == toList (fromList [4 + 2 ^ 39, 4])
- оно работает, а при переносе в исходник требуется указать, какие именно целые числа имеются ввиду. Например, так
zz = S.toList (S.fromList [4::Integer, 4 + 2 ^ 39]) == S.toList (S.fromList [4 + 2 ^ 39, 4])
no subject
Конечно будет true, т.к. 4::Int + 2 ^ 39 == 4 на архитектурах с 32-битными интами:
Prelude> [4 + 2 ^ 39, 4::Int]
[4,4]
Prelude> [4 + 2 ^ 39, 4::Integer]
[549755813892,4]
no subject
a zachem ispol'zovat' Data.HashSet
v chem bonus?
no subject
Я не знаю, я не использую.
Реализации и интерфейсы существенно различные.
HashSet требует от элементов реализации Hashable.
Set требует реализации Ord.
Думаю, что проще в реализации и быстрее исполняется в конкретном случае - то и надо использовать.
no subject
>> Я не знаю, я не использую.
hurraaa!!! a to ja dumal, chto ja odin takoj :)
spasibo za raz'jasnenija
no subject
Set имеет логарифмическую (от размера сета) стоимость для insert / delete / lookup. HashSet амортизирует эту стоимость за счёт O(1) операции хеширования (дальше логарифмическая стоимость поиска по меньшему субсету).
no subject
no subject
ну, тогда вычислить хеш один раз и сравнивать хеши просто, а сравнивать сложный объект каждый раз - не просто.
no subject
А можно разложить по полочкам, почему пример с HashSet выдал False? Я сегодня с утра когда глядел, мне показалось, что весь сет бьётся на субсеты с помощью хеша, а субсет-то всё равно Set. Т.е. значения с одинаковым хешем всё равно должны оказаться упорядоченными в каждом субсете. Вот и не понятно, в чём прикол тогда.
no subject
no subject
по ключу (hash a) нашли существующее значение и скомбинировали его с новым: (S.insert a). Поскольку S.insert==Set.insert, то должно быть отсортировано. quickcheck что, к разным типам привёл два списка?
no subject
Это исключено, т.к. (==) :: Eq a => a -> a -> Bool, а не (Eq a, Eq b) => a -> b -> Bool, т.е. сравнению требуется 2 одинаковых типа.
Вы на toList и fromList посмотрите. Как происходит вставка одного элемента - иррелевантно, т.к. пример её не использует.
no subject
(no subject)
no subject
fromList :: (Hashable a, Ord a) => [a] -> HashSet a
fromList xs = foldl' (flip insert) empty xs
да, я понимаю насчёт Eq, но как ещё объяснить разницу. Если бы объекты были одинаковы, то insert выполнился бы одинаково.
Мне доустановить ещё чё-то там надо. А то бы просто глянуть на fromList одного и другого.