Чтобы добавлять сообщения и комментарии, .

@ndtimofeev:
ndtimofeev

Я правильно понимаю что show для ByteString не экранирует \n?

@qrilka:
qrilka

теперь systemd и в хачкеле — seas.upenn.edu (хотя по идее это System D)

@qnikst:
qnikst

хочется написать что-то вроде:

class T a where type ReqRep a :: -> ; reqrep :: a -> ReqRep a x -> x

для того, чтобы можно было передавать запросы гадтами, которые типизированы возвращаемым результатом. Но при этом я теряю возможность сдеать простые классы, где запрос это Int а релзультат всегда Bool анпример.

Как сделать, чтобы и то и другое работало и запрос не надо бы было паковать в гадт?

@agr:
agr

теперь и в ИТМО. github.com

@ndtimofeev:
ndtimofeev

tab.snarc.org

@ndtimofeev:
ndtimofeev

В пакетном менеджере Cargo реализована команда "cargo check", при указании которой компилятором выполняются все совершаемые при сборке проверки кода, но пропускаются достаточно ресурсоёмкие стадии, связанные с генерацией исполняемых файлов. Для некоторых проектов "cargo check" может выполняться в несколько раз быстрее обычной сборки, что позволяет значительно сэкономить время разработчика при выполнении тестовых пересборок, обычно используемые в процессе разработки чтобы убедиться, что добавленный код компилируется; Хм… А ghc умеет в то чтобы натравить на исходник тайп-чекер и не генерить ничего?

@blaze:
blaze

Achievement unlocked: попытаться отобрать себе пакет на hackage.

@ndtimofeev:
ndtimofeev

Есть набор команд для устройства. Все команды по разному сериализуются и могут иметь свой собственный тип ответа. Требуется сформировать очередь из этих команд (вернее из пары команда — TMVar c типом ответа на команду) внутри remote-монады, затем переупаковать эту очередь и отослать в мир. Проблема в том, что я никак не придумаю как бы мне описать команды так чтобы можно было осуществлять более-менее нормальный паттерн-матчинг для очереди.

@qnikst:
qnikst

а можно ли написать:
```
data Q = Q (forall a . TChan (Request a, TMVar (Reply a)) }
Foo { foo :: Q }
runQ :: Foo -> Request a -> IO (Reply a)
runQ f = case foo f of
Q t = do v <- newEmptyTMVarIO
atomically $ writeTChan t (x,v)
atomically $ takeMVar v
```
и не свести GHC с ума? и не получить unsafeCoerce, Request a это GADT такой если что

@qnikst:
qnikst

хочу local data в haskell вот в посте выше у меня был тип A

data A (c :: * -> Constraint) = forall a . SafeCopy a => A (Dict (c a))

смысла в нём никакого, т.е. просто протаскиваем словарик для экзестенциального типа,
плюс ещё констреинт фиксируется, используется в самой функции, а так же у вызывающего эту функцию, например:

(\(SomeResourceDict (Dict :: Dict (Resource a))) -> A (Dict :: Dict (Resource a)))

Рядом мне нужно сделать data A3 (c :: -> -> * -> Constraint), который совсем похожий. В итоге было бы круто если бы такие бредовые типы можно было локализировать в функции. Кого позвать?

@qnikst:
qnikst

decodeAnyResource :: forall p t f . Typeable f
=> Proxy (p :: * -> Constraint)
-> Proxy t
-> (f -> A p)
-> (UUID -> String)
-> (forall a . p a => a -> t)
-> RemoteTable
-> ByteString
-> t


давно такой радости не писал, ну хоть чуть весело.

@rufuse:
rufuse

А есть ли какие-то флаги для GHC RTS кроме -H, которые могут повлиять на то, при какой занятости кучи врубается GC? -H поднимает минимальную планку, которая suggest'ится в RTS, а свипы все равно срабатывают на 30% загрузке емнип. Хотелось бы флажок, который бы оверрайдил эти 30%, а не потенциально блоатил кучу.

@ndtimofeev:
ndtimofeev

import Data.Proxy
import Data.Kind

type family Saturate (f :: k) (v :: a) :: Type where
    Saturate (f :: a -> Type) v = f v
    Saturate (f :: a -> k)    v = Saturate (f v) v

data Select f = Select (forall a. Saturate f a -> a)

sel :: Proxy f -> (forall a. Saturate f a -> a) -> Select f
sel _ = Select

data T a b c = T { x :: a, y :: b, z :: c }

Есть такой кусочек кода. Всё как всегда:
Select x — реджектится компилятором (без явной аннотации типа) потому что из Saturate f a нельзя вывести f.
sel x — работает, но таскать Proxy (или явную аппликацию типа) не хочется.
Есть шанс сделать красиво?

@qnikst:
qnikst

blog.tweag.io

линейные типы всем даром, пусть никто не уйдет обиженным

@qnikst:
qnikst

где научиться писать композабельный и реюзабельный TH?
почему люди пишут функции на Name, а не TypeQ там где нужно тип передать?
и многие другие вопросы про TH где почитать?

@ndtimofeev:
ndtimofeev

А зачем в мире победившего FTP нужны F-алгебры?

@rufuse:
rufuse

Емнип есть часть флажков, которые играют в кабале только для executable таргетов(вроде -threaded). Можно ли где-то список посмотреть/узнать?

@rufuse:
rufuse

Коллективный разум, помоги отдебажить: тестировал приложение яндекс-танком(нагрузочная тестилка такая), обнаружился странный момент — если дать постоянную нагрузку без "простоев", то приложение в какой-то момент перестает отвечать за разумное время(я в танке жду 60с и это совсем неприемлимо, в нормальном режиме за 10-15 отстреливает), как будто у него внутри локи какие-то, а проц до конца даже и не догружает. GC сейчас гляну(пока компилит), но вообще не очень понятно куда и как копать.

@ndtimofeev:
ndtimofeev

hackage.haskell.org — Смеяться после слова лопата^W^Wизучения того как работает pPrint.

@blaze:
blaze

пиздец, что, серьезно очередной haskellcast?!

@ndtimofeev:
ndtimofeev

В догонку к #2864255. Частично проблема решается явным экспортом полученных переменных. Теперь документация содержит те же символы что и загруженный модуль. Проблема в том, что я пытаюсь scrap my boilerplate и тут такой удар от классика.

@ndtimofeev:
ndtimofeev

Ну я так не играю. Я могу изобразить топ-левел биндинг с паттернматчингом, но haddock не умеет генерировать документацию^Wупоминания переменных созданных в этом паттерне, что сводит полезность вышеперечисленного на нет. Если в топ левеле объявить биндинг вида (var1, var2) = ('c', True), то в документации будет упомянут только var1.

@ndtimofeev:
ndtimofeev

ghc.haskell.org ghc.haskell.org — Мне кажется или что-то пошло не так?

@qnikst:
qnikst

Использование ранк 2 тайпс для защиты ресурсов знакомо всем, но мне хочется идти дальше, мне нужно внутри rank2 уметь инвалидировать ранее созданные в этом ранк 2 ресурсы. Т.е.
```
x <- allocate
use x
foo
Тут x использовать уже нельзя
```
Один вариант это сделать foo CPS но это муторно и будет плохо работать в циклах, есть еще варианты? Indexed Monad взлетит?

@qnikst:
qnikst

как инстанс с MultiParamTypeClass преставляется в TH? мне лень минимальный пример делать..

@rufuse:
rufuse

А какие существуют рекомендации по дефолтному количеству ядер и вообще железу для хаскелльных приложений? Есть приложение, где не получается честно замерить пока что, а рекомендации по железу уже нужны. С ОЗУ там понятно — чем больше, тем лучше, а по количеству ядер ЦПУ капается производительность где?

@datacompboy:
datacompboy

все уже желающие на цюрихак запейсались? никто нынче не забыл?

@trapdoor:
trapdoor

hackage.haskell.org

@trapdoor:
trapdoor

type Oh = IO
type Shit = ()

main :: Oh Shit

@qnikst:
qnikst

Если программист на Haskell говорит reflection, generic и singleton, то в большинстве случаев его не понимают

@agr:
agr

В Галуа открыты вакансии. Опять.
functionaljobs.com

@qnikst:
qnikst

У меня такой вопрос, есть:

class Foo a where foo :: proxy a -> UUID

у меня есть (n::TH.Type), я могу сделать reifyInstances ''Foo n и получить instance Foo, вопрос, а могу ли я в том же TH получить значение этого UUID?

@ndtimofeev:
ndtimofeev

github.com — это такой optparse-generic для питона?

@segfault:
segfault

opennet.ru
Срочно нужен ghcwa!

@qnikst:
qnikst

а вы бы убили человека который сделал A.Internal такой, что если в юзающем его коде (модуль A) использовать <$> вместо <$!> то треш угар и сегфолты?

при этом никто кроме модуля A не использует A.Internal

@blaze:
blaze

смотрю на то, что нахреначил автор dbus там в коде и думаю, стоит ли пытаться на себя перетащить maintenance этого пакета или послать все нахрен и сделать биндинги к клиентской библиотеке gnome-keyring. Он там держит свою библиотеку для тестов, свои биндинги к libxml для парсинга XML... как представлю, что все это надо будет выкинуть нахер и поменять на поддерживаемое — грустно становится.

@segfault:
segfault

Чот я туплю, а у нас в бейз разве нет Eq1 и Ord1? А где правильнее взять?

@qnikst:
qnikst

есть хацкельный кусок данных, который нужно будет сериализовать, есть сишная функция, которая будет это использовать, есть варианты:
1. Сериализатор скажет нужный размер, я выделю в haskell память при помощи Foreign.Marshal.Alloc.allocaBytes и запишу туда все передам указатель в сишную функцию.
2. Сериализатор скажет размер я вызову сишную функцию, где на стеке выделю нужный размер и позову callback в haskell чтобы он туда сериализовал функцию
3. Сериализатор скажет размер и выдаст сишную функцию (это не реально так?) которая сериализует значение и далее как в 2 только без callback в haskell.

Что из этого лучше всего? Поидее 1. самое простое, но обидно, что будет выделяться память в haskell куче, когда все можно бы было провернуть на стеке, с другой стороны учитывая какой стек в haskell, но нужно будет колдовать как с gmp. А по поводу 2 vs 3 непонятно, что выдет дороже... В общем фигнёй какой-то страдаю.

@ndtimofeev:
ndtimofeev

Больше всего мне в Generic'ах не хватает возможности доказать что у оложенного типа тоже есть Generic (или нет) и поветвиться по этому.

@ndtimofeev:
ndtimofeev

nponeccop.livejournal.com