Норм? https://bitbucket.org/k_bx/aeson-migrate/src/default/tests/Tests/TestSimpleMigration.hs
Ура! // обмазываюсь потихоньку, сокращаю строки кода
ReportDataMap $!! (hm & at (ev ^. evAdId) . non mempty
. rdPerHourMap
. at (hourTS ev) . non mempty
. rhViews +~ 1)
-- ReportDataMap $!! H.insertWith
-- (\_ old -> incReportDataView (hourTS ev) old)
-- (ev ^. evAdId)
-- (singleViewReportData (hourTS ev))
-- hm
Недели охуительных багов в мкдоналдс
https://github.com/informatikr/hedis/issues/15
https://github.com/bos/attoparsec/issues/70
Посоветуйте, кто пользовался, хороший LRU для хаскеля (или как искать). При том, что скорее всего придётся немного допилить его API под конкретную нужду (а может взять и свой небольшой написать?).
Паттерн использования такой: идёт поток ивентов, среди них нужно учитывать только последний по какому-то id-полю. То есть пока я думал сделать LRU-кеш, переписывая по этому самому id-полю значения, при удалении из LRU считать объект "конечным", также при окончании ивентов всё, что внутри LRU считать конечным.
Продолжая популярную тему "что меня восхитило" хочу поделиться, что только что написал вот этот кусок кода:
countViewsAndDurationsFold :: L.Fold Event ReportDataMap
countViewsAndDurationsFold = countViewsFold `mappend` countDurationsFold
Вот это меня действительно восхитило.
Испытал экстаз от того, как красиво и элегантно в persistent пишется функция, которая инсертит запись в таблицу, если там такой ещё нет, и возвращает id записи (либо новой, либо найденной):
insertLanguage language = do
let lang = Language language
entity <- getByValue lang
case entity of
Nothing -> do insert lang
Just e -> return $ entityKey e
Пять строк, пять строк! И не какого-то там мозговыносящего матана с функторами, а нечто такое, что питонист, взглянувший на это, просто подумает: «о, в третий питон ещё и стрелочки какие-то впилили, прикольно».
Тот факт, что insert
возвращает id созданной записи, ранее было поводом отдельного экстаза.
Удобное приведение типов, теперь и в х-ле!
import Data.Maybe (fromJust)
import Data.Aeson (decode, encode)
jsonCast :: (ToJSON a, FromJSON b) => a -> b
jsonCast = head . fromJust . decode . encode . (:[])
Теперь можно кастовать список интов в вектор даблов. Или различные числовые типы между собой.
♥ jsonCast ([1,2,3] :: [Int]) :: Data.Vector.Vector Double
fromList [1.0, 2.0, 3.0]
♥ let q = jsonCast; a=3::Int; b=1.3::Float; c=Just 10
♥ q a + q b + q c :: Double
14.3
Мой маленький парсер логов, который берёт инпут из stdin, в какой-то момент постоянно начинает получать:
<stdin>: hGetLine: invalid argument (invalid byte sequence)
Сделал маленький пример на воспроизведение https://bitbucket.org/k_bx/infinite_getline , жду пока повторится.
У Ромы Чепляки неизменно отличные презентации: http://ro-che.info/docs/2013-11-14-haskell-and-oop.html
Самые редкие профессии на рынке труда по итогам 2013 г.
№ Позиция Количество вакансий в России (шт.)
1 Lisp-программист 0
4 Haskell-программист 2
5 IT-евангелист 2
А вообще, очень рад расширению OverloadedLists [0]. Особенно в контексте удобного создания непустых списков, например.
https://www.haskell.org/ghc/docs/7.8.1/html/users_guide/type-class-extensions.html#overloaded-lists
Если, вдруг, кому нужно https://bitbucket.org/k_bx/docker-ghc-7.8