@haskellru

Страница 783 из 1551
Index
27.01.2018
10:16:34
в пакет мне

https://github.com/int-index/union/issues/8

И матчить так: case u of OU1 a -> ... OU2 b -> ... OU3 c -> ...

А еще можно поэкспериментировать с type-indexed паттернами, чтобы было вроде case u of OU (a :: Integer) -> ... OU (b :: Bool) -> ... OU (c :: Char) -> ...

Google
Index
27.01.2018
10:25:25
Правда мне кажется, что с exhaustiveness-чекером тут не договоришься

Дмитрий
27.01.2018
10:31:48
А еще можно поэкспериментировать с type-indexed паттернами, чтобы было вроде case u of OU (a :: Integer) -> ... OU (b :: Bool) -> ... OU (c :: Char) -> ...
Вот сейчас меня пробило, а что, так можно что-ли? Мне почему-то всю жизнь казалось, что ghc не хранит метки типов в рантайме.

Index
27.01.2018
10:32:14
Не хранит

Но там не просто так OU написано :)

Alexander
27.01.2018
10:33:26
а с сетами не удобно что я не знаю разумного способа жить с перестановками элементов

Index
27.01.2018
10:44:07
В общем я сделал OU, а не exhaustiveness придется забить

pattern OU :: UElem a as (RIndex a as) => a -> OpenUnion as pattern OU a <- (preview openUnion -> Just a) where OU a = review openUnion a

Блин, бенчмарки не работают почему-то

Benchmark bench: RUNNING... benchmarking openUnion matching 1st time 4.897 ns (4.892 ns .. 4.905 ns) bench: <stdout>: commitBuffer: invalid argument (invalid character) 1.000 RBenchmark bench: ERROR

что это вообще такое

Alexander
27.01.2018
10:45:16
ТН могло бы помочь

Index
27.01.2018
10:45:35
С чем?

Google
Index
27.01.2018
10:45:53
Ты предлагаешь каждый кейс генерить?

Alexander
27.01.2018
10:45:55
т.е. если у тебя есть split возвращающий элемент или сет без этого типа

Index
27.01.2018
10:46:09
Есть такой, да

Alexander
27.01.2018
10:46:10
тогда вложенные матчи чнкаются

Denis
27.01.2018
10:46:11
Alexander
27.01.2018
10:46:21
но писать это руками не хочется

Index
27.01.2018
10:46:23
чтобы разный код на матчинг/конструкцию

но писать это руками не хочется
Надо попробовать а-ля total

Alexander
27.01.2018
10:48:28
так вот с помощью ТН можно было бы переводить у удобную форму ну или плагином

Index
27.01.2018
10:49:01
Плагином как ты себе это представляешь?

Alexander
27.01.2018
10:49:10
кстати у тебя через Here|There?

Index
27.01.2018
10:49:19
Да

Правда я их назвал This и That

Index
27.01.2018
10:52:36
ну вон же в примере на матчинг preview, на конструкцию review

Denis
27.01.2018
10:53:13
В секции where как раз на конструкцию?

Index
27.01.2018
10:53:57
Да

Denis
27.01.2018
10:54:52
Ну по сути как то можно было заменить на Viewpatterns в матчинг

Index
27.01.2018
10:55:36
Там и есть ViewPatterns в синониме

Google
Denis
27.01.2018
10:56:01
Точно

Проглядел

Alexander
27.01.2018
11:19:05
ну viewpattern напрочь убивают exhaustiveness analysis

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

но вроде никак т.е. Int не индуктивный

Igor
27.01.2018
11:44:04
Третий день Хаскель ковыряю, и пока еще сильно плаваю. У меня вопрос: как по-человечески пишется что-то вроде mapM_ (\f -> readFile f >>= putStr) files?

Дмитрий
27.01.2018
11:44:53
https://t.me/haskell_learn

Igor
27.01.2018
11:46:24
https://t.me/haskell_learn
Спасибо! А тут только серьезные вопросы обсуждаем? ?

Kirill
27.01.2018
11:50:29
не особо

а по вопросу вроде нормально "императивненько" записывается через forM_ files $ \f -> do{ contents <- readFile f; putStr contents}

Pineapple
27.01.2018
11:57:45
mapM (putStr <=< readFile) files

Антон
27.01.2018
11:58:34
Pineapple
27.01.2018
11:59:11
Да

Igor
27.01.2018
12:25:47
Из обоих чатов я понял, что forM_ + do привычнее. За <=< спасибо! Именно то, что искал.

Антон
27.01.2018
12:29:36
Линзы — да, вещь удобная, но, во-первых, требуют TH, во-вторых, ломают вывод типов

> с этим бывают проблемы, кстати. В развесистом линзокоде у меня такое бывало - сделал s/$/./ и перестало чекаться ибо стало слишком полиморфно Есть пропозал для GHC разрешить do в позиции аргументов. В этом случае можно будет, в частности, отменить специальное правило типизации $

Aleksey
27.01.2018
12:31:24
TH необязателен - можно руками писать все линзы. Вывод типов с линзами обычно работает наоборот: знаешь, что что-то эдакое в линзах можно, пишешь сигнатуру и дальше жогглируешь traversed и прочим, пока не соёдется :)

A64m
27.01.2018
12:33:45
отменить нельзя будет, никто код без $ переписывать не станет

Denis
27.01.2018
12:53:20
Leonid
27.01.2018
13:08:02
https://github.com/haskell/ecosystem-proposals/pull/6 чёт не холиварят

Google
Alexander
27.01.2018
13:13:07
наконец-то толково написали

хотя и перемудрили

Anatolii
27.01.2018
18:27:17
а ghcid не может поломаться из-за template-haskell?

Admin
ERROR: S client not available

Anatolii
27.01.2018
18:27:58
stack ghci нормально загружается

а ghcid игнорит 2 модуля с persistent декларациями

может -fno-code виновен?

Dmitry
27.01.2018
18:30:01
а ghcid не может поломаться из-за template-haskell?
Может. Именно из-за этого и ломается скорей всего. Есть открытое issue: https://github.com/ndmitchell/ghcid/issues/101

Anatolii
27.01.2018
18:42:11
ну я решил также проблему как в issue

Donat
27.01.2018
19:44:47
для ghc ничего вроде distcc ещё не придумали?

Alexander
27.01.2018
19:46:36
нет вроде

Donat
27.01.2018
19:50:05
нагуглил несколько очень древних постов в которых обсуждение затихло после пары постов

видимо, никто не осилил...

Евгений
27.01.2018
20:47:43
@qnikst выше

Alexander
27.01.2018
20:48:00
+

Антон
27.01.2018
21:27:30
Поругайте кот, пожалуйста: shiftedZipWith f vec = enumFromTo 0 (len-1) & map index &&& map (index . (`rem` len) . (+1)) & uncurry (zipWith f) where len = V.length vec index = (vec V.!) shiftedSum = shiftedZipWith (+) shiftedFSub = shiftedZipWith (flip (-)) polygonArea = curry $ (/2) . fromIntegral . abs . sum . uncurry (zipWith (*)) . (***) shiftedSum shiftedFSub

Aleksey
28.01.2018
04:27:13
Опять же, зачем flip (-), если можно сменить порядок прямо в shiftedZipWith, если уж для shiftedSum ничего не изменится (ибо (+) коммутативен)

Опять же & не то чтобы чаcто используется, гораздо чаще встречается $. Иначе слишком часто придётся менять направление чтения - композиция то читается справа-налево в той же polygonArea

shiftedZipWith f vec = V.zipWith f vec shiftedVec where shiftedVec = V.snoc (V.tail vec) (V.head vec)

Google
Yuriy
28.01.2018
05:53:07
(&) и flip — ерунда по сравнению с enumFromTo, (&&&) и uncurry. когда кто-то из них встречается, здесь, вероятно, что-то переусложнено

Aminu Saleh
28.01.2018
10:22:39
Aslm

Антон
28.01.2018
10:29:37
Или кто-то заюзал сервис pointfree
Не-не, всё вручную писал

shiftedZipWith f vec = V.zipWith f vec shiftedVec where shiftedVec = V.snoc (V.tail vec) (V.head vec)
Это да, но конкатенация векторов - это О(n), а мне хочется поэффективнее. Индексацией напрямую можно получить то же самое, но без конкатенации

Aleksey
28.01.2018
10:32:22
Нет конкатенации векторов, есть snoc

К тому же n запросов по индексу, это та же сложность, не?

Антон
28.01.2018
10:34:37
Aleksey
28.01.2018
10:35:54
Так zipWith все равно в обоих вариантах есть

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

Aminu Saleh
28.01.2018
10:38:32
Hello

? animufag ?
28.01.2018
10:46:15
Oleg
28.01.2018
12:40:51
Не знаю, пофиксили ли, но встречал и испытывал на себе, что uncurry не лучший выбор в плане для перфоманса иногда https://stackoverflow.com/a/38440296/210905

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