Dmitry
8.2 точно работает
Ilya
ага, но у меня там энивей не 2 инстанса, а 3. Так что придется ввести вспомогательный енум
Ilya
но в целом работает
Ilya
Dmitry спасибо
Dmitry
не нравится ... m (m a) ... как-то на ... m a ... хорошо бы параметры переделать
Ilya
ну оно только для одного инстанса так криво
Ilya
для других весьма логично
Ilya
типа Loc t является продьюсером в монаде m
Ilya
без этого указания потом гхц погрязнет в амбигуити
Ilya
Dmitry нет, я всё-таки не до конца догоняю почему оно работает. Потому что IsLoc иньективна и на этом GHC успокаивается?
Dmitry
хм..., а мне непонятно, что непонятно?
Dmitry
IsLoc, конечно, не инъективна. Почти всегда False дает. Инъективность не при чем
Ilya
в итоге после интеграции в модуль по месту использования валятся ошибки вида
/haskell-wasm/src/Language/Wasm/Builder.hs:264:24: error:
• Couldn't match type ‘OutTypeHelp
(GetProdType (m34 (Proxy 'F32))) (m34 (Proxy 'F32))’
with ‘OutTypeHelp
(GetProdType (m32 (Proxy 'F32))) (m32 (Proxy 'F32))’
arising from a use of ‘sub’
Ilya
я не уверен, что получится из этого вытянуть изолированный пример, но если кому-нибудь не лень позвать стэк для сборки, то могу закоммитить в веточку нерабочий код
Dmitry
Была проблема, что Loc t и m (Proxy x) перекрывались. Так как в случае Loc (Proxy t) неясно какой инстанс использовать. Мы сказали, что, если Loc, то нужен инстанс для Loc, а не для m. (Это я телепатически догадался, а GHC не смог). Это мы явно передаем в первом параметре. Важно, что это не в констрейнте, а в нормальном параметре-типе.
Dmitry
А почему в одном месте m34?
Dmitry
т.е. в двух
Dmitry
почему они должны матчиться?
Dmitry
Если должны, напиши в сигнатуре констрейнт - в той функции, в которой вызываешь. Типа OutTypeHelp a ~ OutTypeHelp b
Ilya
я покоментировал там лишнее что бы свести проблему к чему-то менее контекстнозависимому
Ilya
есть например вот такая ошибка:
haskell-wasm/src/Language/Wasm/Builder.hs:875:19: error:
• Couldn't match type ‘OutType (Glob 'I32)’
with ‘OutType (Loc 'I32)’
arising from a use of ‘add’
NB: ‘OutType’ is a type function, and may not be injective
Ilya
add :: (GenFunMonad m, Producer m a, Producer m b, OutType a ~ OutType b) => a -> b -> m (OutType a)
Ilya
и вот само место вызова if' i32 ((heapNext `add` alignedSize) `lt_u` heapEnd)
Ilya
OutTypeHelp a ~ OutTypeHelp b не так-то просто добавить, он уже 2 аргумента требует
Dmitry
А чему реально OutType (Glob 'I32) и второй равны?
Ilya
потому что оба Proxy 'I32
Ilya
если интересно больше контекста - https://github.com/SPY/haskell-wasm/blob/refactoring/builder-monad/src/Language/Wasm/Builder.hs#L875
Dmitry
Точно? Замени вызовы на undefined, загрузи ghci, сделай kind! OutType (Glob 'I32)
Dmitry
фух, может завтра гляну как-нибудь...
Ilya
да, всё равно большое спасибо, у меня как минимум есть направление куда ковырять теперь
Ilya
btw,
λ> :kind! OutType (Glob 'I32)
OutType (Glob 'I32) :: *
= OutType (Glob 'I32)
Ilya
он почему-то не раскрывает эту тайпфункцию
Dmitry
Посмотрел код. Я бы убрал ProducerType и лишний инстанс. Loc и Glob, похоже, одинаковые. Можно передавать Bool.
import Data.Type.Bool
.... m == Loc || m == Glob ...
Ilya
Ilya
Я не очень понимаю почему гхц не может раскрыть OutType
Ilya
Dmitry
Мне по коду многое кажется неудачным. По последней ошибке - замена add на add @GenFun заменяет одну ошибку на другую ;-)
Dmitry
Кажется, что перекручено сильно...
Dmitry
А GADT туда не лезет?
Dmitry
Вроде для такого рода задач GADT самое то бывает
Mish
Всем привет. Подскажите, существует ли плагин для idea, который причесывает дизайн кода (аналог scalafmt) ?
Andrei
Cheese
точно есть утилиты, которые можно запускать без idea
Cheese
hindent, stylish-haskell, brittany, hfmt
Andrei
в общем-то это и есть аналог scalafmt
Mish
@cblp_su @develop7 спасибо, втащил hfmt
Cheese
только мне не нравится, как они причёсывают. у Хаскеля семантика слишком далека от синтаксиса. когда я руками расставляю блоки, код более читаемый
Cheese
разве что stylish для импортов
Anatolii
я пока тоже на stylish остановился
Anatolii
без форматеров
Anatolii
но коненчо иметь какой-то форматер единый было бы хорошо
Cheese
не думаю, что это возможно
Sr
Мне кажется хаскель крайне свободный в плане форматирования
Sr
Например тот же блок if then else
Sr
Где-то его удобно одной строчкой
Sr
А где-то несколькими
Sr
Тем более хаскель настолько выразительный, что именно ручками расставлять акценты правильнее, автоматически врядли что-то можно адекватное сделать
A64m
тем временем для 8.6, похоже, готово удаление старой фичи, комитет это уже принял, но работы над имплементацией я заметил только сейчас
убираются старые экстеншены DataKinds/PolyKinds, теперь эти прагмы будут включать TypeInType
Serghei
Ребят а посоветуйте научпоп по категориям
Serghei
чтобы доступным языком
Aleksei (astynax)
Евгений
Милевски переводили же, в чатике по теоркату был линк
Darwin
Я в ТК так и не смог, к стыду, но в закладках из того, что тут рекомендовали — http://telegra.ph/Materialy-po-teorii-kategorij-12-22
Из самого доступного, что я встречал — лекции Брагилевского (есть на youtube), но всё равно очень тяжело идёт.
Darwin
https://vk.com/home_kana?w=wall-135720595_743
Darwin
A64m
A64m
емнип, этот форматтер вообще декларации не мог форматировать до недавнего времени
Aleksei (astynax)
Хмм, просто "Retain newlines and comments unmodified". Ну ок
Kirill
а если у меня есть модуль, можно как-то понять из какого он пакета? В GHCi например?
Kirill
а, хотя уже нашёл этот модуль, но всё равно интересно, если кто в курсе
Cheese
но это явно не оптимально
Cheese
ghc-pkg надо посмотреть
Aleksei (astynax)
Оно вроде хуглится
Kirill
он разве модули может показывать из пакетов?
Kirill
с хуглом вопрос что модули они ещё и переименовываются :)
Aleksei (astynax)
Можно хуглить хуглом снапшота, если стек используется
Kirill
хотя в случае стакана вроде хугл должен по снэпшоту искать