Andrey
... where data X = X ...
Cheese
исправь ошибки
я намекаю, что фраза «не компилируется» несёт слишком мало информации
21it
Yuriy вот такая ошибка при попытке запустить тест • No instance for (Eq (IO (Scraped URL))) arising from a use of ‘assertEqual’
Andrey
21it
мои собственные типы deriving (Show, Eq, Ord)
21it
я думаю тут вся сложность в IO
Cheese
Yuriy вот такая ошибка при попытке запустить тест • No instance for (Eq (IO (Scraped URL))) arising from a use of ‘assertEqual’
надо вытащить значение из IO перед сравнением do result <- scrap assertEqual expected result
Cheese
ок
можно вынести эту функцию с её определениями в отдельный модуль
Andrey
да я лучше таплами обойдусь в таком случае 🙂 спасибо, модуль тут не нужен
21it
в таком случае будет писать "error: parse error on input ‘do’"
Cheese
я думаю тут вся сложность в IO
о, это самая типичная проблема новичков в Хаскеле
21it
почему-то в юнит-тестах do нотации не любит компилятор
кана
элмовая архитектура плоская, это как одна нода
Cheese
в таком случае будет писать "error: parse error on input ‘do’"
надо отступы правильно расставить. наверно, тело do-блока сдвинуть вправо немного
Cheese
почему-то в юнит-тестах do нотации не любит компилятор
всё просто. компилятор не любит неправильный код
Cheese
в принципе, интуиция в отступах довольно быстро вырабатывается
кана
элмовая архитектура плоская, это как одна нода
-- 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" .~ ""
Alexander
как правильно писать тесты зависящие от времени, если не хочется вводить MonadTime ?
Leonid 🦇
передавать время явно
Alexander
явно передавать функцию доставания времени тоже не хочется
Alexander
некуда
Leonid 🦇
ну а monadtime ты куда собрался передавать?
Alexander
передача времени явно это не очень хороший интерфейс
Alexander
нужный только для тестов
Leonid 🦇
смотря для чего
Alexander
для lru
Alexander
т.е. поидее часы это внутренняя деталь реализации
Alexander
запилил в ядре сервиса передачу времени и внешний метод, прячущий
Алексей
А зачем там время? Из кеша выгоняют по времени, а не по числу использований?
Alexander
по числу использований не удобно
Alexander
там надо размер рядом хранить, а вычисление его O(n)
Alexander
тем более тут я хочу все равно быть уверенным, что результат не будет лежать слишком долго
Dmitry
если (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
Cheese
правильный путь — передавать функцию времени явно странный путь — подменять библиотеку time в тестах
Alexander
мне больше понравилось, что @lonokhov предложил, если честно
Leonid 🦇
по хорошему нужно подменять модуль же
Leonid 🦇
бэкпек и это всё
Alexander
ну хорошее не скоро придёт
DelightfullyBitchySweets
/stat@combot
Combot
combot.org/c/-1001043143583
DelightfullyBitchySweets
Добрый день.
DelightfullyBitchySweets
Я новичок и мне нужна помощь в написании программы для дискретной сгортки сигналов
DelightfullyBitchySweets
Такую программу я писал на С и С++ и там ничего сложного небыло
DelightfullyBitchySweets
Но в функциональном варианте что-то ничего непонятно
DelightfullyBitchySweets
Может кто-то сможет помочь, буду очень благодарен
Alexander
что именно не понятно?
Alexander
ответить на вопросы и помочь тут ответят и помогут, переписывать программу полностью, врятли будут
DelightfullyBitchySweets
Как организовать сдвиг массива и умножения клиентов которые находятся один над вторым
Alexander
самое просто - точно так же как и в любой императивной программе: 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
для более удобной индексации можно использовать Ix: https://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Ix.html
DelightfullyBitchySweets
Спасибо
DelightfullyBitchySweets
Буду разбираться
Alexander
но вообще лучше вопросы в формате, хочу X, есть Y (ссылка на gist), не получается Z, пробовал W
Alexander
тогда ответы будут более точными
DelightfullyBitchySweets
На следующий раз буду знать как вопросы ставить
Alexander
просто иначе нормальная подсказка будет если кто-то конкретно этой проблемой занимался
Alexander
ну или если повезет
Alexander
ура встретил место где atomicModifyIORef' (с prime) было не правильно, а надо atomicModifyIORef
Misha
ура встретил место где atomicModifyIORef' (с prime) было не правильно, а надо atomicModifyIORef
а как так может быть что strict version может быть неправильной? семантика же одна и та же, если только не пихать туда бесконечных списков и всякого такого
Alexander
любой узел, например
Alexander
если то, модификация зависит от результата дальшейшего
Alexander
правда я радостно что-то наврал и оно у меня виснет в более сложном случае
Alexander
:/
Alexander
причем почему - не ясно
Ilya
Как организовать сдвиг массива и умножения клиентов которые находятся один над вторым
zipWith для перемножения ряда на ряд, reverse для обращения ряда, init и tail для сдвигов
Ilya
Что там ещё может понадобиться... Может cycle для зацикливания
Misha
если то, модификация зависит от результата дальшейшего
хм окей, мне надо помедитировать над этим
Alexander
x <- atomicallyModifyIORef ref $ f z z <- g x
Alexander
грубо говоря
Misha
x <- atomicallyModifyIORef ref $ f z z <- g x
а! действительно типа классическая проблема laziness + IO
Alexander
я вот правда не уверен, что так надо часто делать