
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

Google

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

kana
16.09.2018
20:23:30
элмовая архитектура плоская, это как одна нода

Yuriy
16.09.2018
20:23:54
в принципе, интуиция в отступах довольно быстро вырабатывается


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 }
если (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

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

Alexander
17.09.2018
08:36:02
любой узел, например
если то, модификация зависит от результата дальшейшего
правда я радостно что-то наврал и оно у меня виснет в более сложном случае
:/
причем почему - не ясно

Ilya
17.09.2018
08:42:35

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
грубо говоря

DelightfullyBitchySweets
17.09.2018
08:44:32

Misha
17.09.2018
08:47:00

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)
типа такого

Alexander
17.09.2018
09:05:30

Yuriy
17.09.2018
09:10:29

Евгений
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
ещё в Хаскеле иногда нужна просто полурешётка, а иногда отдельно верхняя и нижняя. и эти классы никак друг с другом не связать. печалька