@haskellru

Страница 1468 из 1551
Yuriy
16.09.2018
20:21:19
ок
можно вынести эту функцию с её определениями в отдельный модуль

Andrey
16.09.2018
20:21:56
да я лучше таплами обойдусь в таком случае ? спасибо, модуль тут не нужен

timCF
16.09.2018
20:22:34
в таком случае будет писать "error: parse error on input ‘do’"

Yuriy
16.09.2018
20:22:51
я думаю тут вся сложность в IO
о, это самая типичная проблема новичков в Хаскеле

Google
timCF
16.09.2018
20:23:26
почему-то в юнит-тестах do нотации не любит компилятор

Yuriy
16.09.2018
20:23:54
в таком случае будет писать "error: parse error on input ‘do’"
надо отступы правильно расставить. наверно, тело do-блока сдвинуть вправо немного

почему-то в юнит-тестах do нотации не любит компилятор
всё просто. компилятор не любит неправильный код

в принципе, интуиция в отступах довольно быстро вырабатывается

kana
16.09.2018
20:28:50
элмовая архитектура плоская, это как одна нода
-- with monadic effects system main :: IO () main = do input <- getLine print input exit -- without getLine :: (String -> s) -> IO s print :: String -> s -> IO s exit :: IO s data State = A | B String | C String step :: State -> IO State step A = getLine (\input -> B input) step (B input) = print input (C input) step (C input) = exit app :: App State app = App { initial = A, step }

Вот сделал https://gist.github.com/odr/7907998753255ff86b23e816b5d9b621
тут есть проблема в этом инстансе instance HasFieldB (name == name') name ((name' ::: c) ': s) ((name' ::: c) ': t) a b => HasField name ((name' ::: c) ': s) ((name' ::: c) ': t) a b where field = fieldB @(name == name') @name

если (name == name'), то вместо типа c должны быть a и b, а вместо s/t должны быть одинаковые r r какие

а если name /= name', то оба c, а дальше s и t

то есть нужно как-то на два инстанса разбить что ли

и это приводит к первоначальной проблеме вроде

если будешь еще пробовать, то тестировать можно на этом примере: type User a = Record ["nickname" ::: String, "age" ::: Int, "payload" ::: a] kana = record @(User Int) "kana" 20 1000 andrew = kana & #nickname .~ "andrew" & field @"age" +~ 10 & field @"payload" .~ ""

Google
Alexander
17.09.2018
07:35:39
как правильно писать тесты зависящие от времени, если не хочется вводить MonadTime ?

Leonid
17.09.2018
07:36:07
передавать время явно

Alexander
17.09.2018
07:36:11
явно передавать функцию доставания времени тоже не хочется

некуда

Leonid
17.09.2018
07:36:34
ну а monadtime ты куда собрался передавать?

Alexander
17.09.2018
07:37:12
передача времени явно это не очень хороший интерфейс

нужный только для тестов

Leonid
17.09.2018
07:37:24
смотря для чего

Alexander
17.09.2018
07:37:38
для lru

т.е. поидее часы это внутренняя деталь реализации

запилил в ядре сервиса передачу времени и внешний метод, прячущий

Pineapple
17.09.2018
07:48:34
А зачем там время? Из кеша выгоняют по времени, а не по числу использований?

Alexander
17.09.2018
07:49:07
по числу использований не удобно

там надо размер рядом хранить, а вычисление его O(n)

тем более тут я хочу все равно быть уверенным, что результат не будет лежать слишком долго

Dmitry
17.09.2018
07:50:38
если (name == name'), то вместо типа c должны быть a и b, а вместо s/t должны быть одинаковые r r какие
Изменил gist. Изменения только тут instance HasFieldB (name == name') name ((name' ::: x) ': s) ((name' ::: y) ': t) a b => HasField name ((name' ::: x) ': s) ((name' ::: y) ': t) a b

Yuriy
17.09.2018
07:57:30
правильный путь — передавать функцию времени явно странный путь — подменять библиотеку time в тестах

Alexander
17.09.2018
07:59:00
мне больше понравилось, что @lonokhov предложил, если честно

Leonid
17.09.2018
08:01:18
по хорошему нужно подменять модуль же

бэкпек и это всё

Google
Alexander
17.09.2018
08:01:35
ну хорошее не скоро придёт

DelightfullyBitchySweets
17.09.2018
08:07:11
/stat@combot

Combot
17.09.2018
08:07:11
combot.org/c/-1001043143583

DelightfullyBitchySweets
17.09.2018
08:09:46
Добрый день.

Я новичок и мне нужна помощь в написании программы для дискретной сгортки сигналов

Такую программу я писал на С и С++ и там ничего сложного небыло

Но в функциональном варианте что-то ничего непонятно

Может кто-то сможет помочь, буду очень благодарен

Alexander
17.09.2018
08:12:59
что именно не понятно?

ответить на вопросы и помочь тут ответят и помогут, переписывать программу полностью, врятли будут

DelightfullyBitchySweets
17.09.2018
08:13:52
Как организовать сдвиг массива и умножения клиентов которые находятся один над вторым

Alexander
17.09.2018
08:15:24
самое просто - точно так же как и в любой императивной программе: https://hackage.haskell.org/package/vector-0.12.0.1/docs/Data-Vector-Unboxed-Mutable.html https://hackage.haskell.org/package/vector-0.12.0.1/docs/Data-Vector-Unboxed-Mutable.html#v:read https://hackage.haskell.org/package/vector-0.12.0.1/docs/Data-Vector-Unboxed-Mutable.html#v:write

Alexander
17.09.2018
08:16:00
для более удобной индексации можно использовать Ix: https://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Ix.html

DelightfullyBitchySweets
17.09.2018
08:17:19
Спасибо

Буду разбираться

Alexander
17.09.2018
08:18:18
но вообще лучше вопросы в формате, хочу X, есть Y (ссылка на gist), не получается Z, пробовал W

тогда ответы будут более точными

DelightfullyBitchySweets
17.09.2018
08:20:59
На следующий раз буду знать как вопросы ставить

Alexander
17.09.2018
08:21:27
просто иначе нормальная подсказка будет если кто-то конкретно этой проблемой занимался

ну или если повезет

Google
Alexander
17.09.2018
08:27:25
ура встретил место где atomicModifyIORef' (с prime) было не правильно, а надо atomicModifyIORef

Misha
17.09.2018
08:35:36
ура встретил место где atomicModifyIORef' (с prime) было не правильно, а надо atomicModifyIORef
а как так может быть что strict version может быть неправильной? семантика же одна и та же, если только не пихать туда бесконечных списков и всякого такого

Alexander
17.09.2018
08:36:02
любой узел, например

если то, модификация зависит от результата дальшейшего

правда я радостно что-то наврал и оно у меня виснет в более сложном случае

:/

причем почему - не ясно

Ilya
17.09.2018
08:42:35
Как организовать сдвиг массива и умножения клиентов которые находятся один над вторым
zipWith для перемножения ряда на ряд, reverse для обращения ряда, init и tail для сдвигов

Admin
ERROR: S client not available

Ilya
17.09.2018
08:42:55
Что там ещё может понадобиться... Может cycle для зацикливания

Misha
17.09.2018
08:43:49
если то, модификация зависит от результата дальшейшего
хм окей, мне надо помедитировать над этим

Alexander
17.09.2018
08:44:12
x <- atomicallyModifyIORef ref $ f z z <- g x

грубо говоря

Misha
17.09.2018
08:47:00
x <- atomicallyModifyIORef ref $ f z z <- g x
а! действительно типа классическая проблема laziness + IO

Alexander
17.09.2018
08:47:20
я вот правда не уверен, что так надо часто делать

Ilya
17.09.2018
08:49:38
Спасибо
Пиши в чат, если не получится. И какая свёртка кстати, линейная или циклическая?

Alexander
17.09.2018
08:51:19
new :: (Hashable a, Ord a) => Config -> IO (Cache a b) new Config{..} = do ref <- newIORef PSQ.empty pure $ Cache { requestOrInternal = \tm k f -> mdo mbox <- atomicModifyIORef ref $ swap . PSQ.alter (\case Just (p,~v) | p >= tm ^-^ cacheLongestAge -> (Just v, Just (tm, v)) _ -> (Nothing, Just (tm, Lazy result))) k result <- maybe (trace "f" $ f k) (evaluate . getLazy) mbox atomicModifyIORef ref $ swap . PSQ.alterMin (\case Nothing -> ((), Nothing) Just (kk,p,v) | p < tm ^-^ cacheLongestAge -> ((), Nothing) | otherwise -> ((), Just (kk,p,v)) ) pure result }

так сработало

Leonid
17.09.2018
08:53:12
^-^ - найс

Google
Alexander
17.09.2018
08:53:18
но добавление Lazy и getLazy не очевидно

из бонусов, что неявный лок на вызове evaluate . getLazy

т.е. только 1 тред будет работу работать

я очень люблю эту фишку, но я боюсь, что это accidental complexity

с другой стороны если не это, то мне бы сложные вещи пришлось бы переизобретать

Aleksey
17.09.2018
09:03:30
^-^ - найс
оператор "котик спрятался, видно только ушки"

Leonid
17.09.2018
09:03:55
оператор nya

kana
17.09.2018
09:03:57
а можно ли в семействах добавлять новые типопеременные?

Leonid
17.09.2018
09:04:22
оператор "котик спрятался, видно только ушки"
хотя я думал так в аниме радость изображают

Aleksey
17.09.2018
09:04:34
И это тоже. Псто я предложил менее виабушный вариант

kana
17.09.2018
09:04:45
f :: HasField "a" r0 r1 String Int => HasField "b" r1 r2 Int String => Record r0 -> Record r2 вот имею такой код, хочу написать хелпер для композиции HasField, но для этого придется скрыть из внешнего скоупа r1 и добавить в скоуп внутри семейства, это реально?

type family RecordDelta fs r0 rn :: Constraint where RecordDelta '[] r r = () RecordDelta ('(name, a -> b) ': fs) r0 rn = forall r1. (HasField name r0 r1 a b, RecordDelta fs r1 rn) типа такого

Yuriy
17.09.2018
09:10:29
а это всего-лишь AdditiveGroup
чем аддитивная группа отличается от группы? только тем, что входит в иерархию классов?

Евгений
17.09.2018
09:10:56
Обычно сложением называют коммутативную операцию

Yuriy
17.09.2018
09:11:29
Обычно сложением называют коммутативную операцию
обычно коммутативную группу называют коммутативной или абелевой

Alexander
17.09.2018
09:12:39
википедия ссылаясь на "Каргаполов М. И., Мерзляков Ю.И. Основы теории групп. — 3-е изд.. — Москва: Наука, 1982. — С. 18. — 288 с. — 11 800 экз." использует аддитивная

но вообще это класс из vector-space пакета

и я не знаю что и как принято называть там откуда родом автор пакета

Yuriy
17.09.2018
09:13:13
ещё в Хаскеле иногда нужна просто полурешётка, а иногда отдельно верхняя и нижняя. и эти классы никак друг с другом не связать. печалька

Страница 1468 из 1551