Cheese
у нас пока нет Пролога на уровне типов
Alexander
тут m определена и известна
Alexander
и StM m () ~ ()
Cheese
ого! есть гист?
Alexander
нету минимального кейса
Alexander
а резать проект очень долго
Alexander
в чуть-чуть более простом случае рядом все ок
Alexander
есть 2 возможные причины:
Cheese
в твоё описание не верится
Leonid 🦇
В серванте нет ничего сложного
Alexander
1. я туплю и не вижу *другую* ошибку типов
Alexander
2. компилятор дурак
Cheese
тут каким-то образом информация об m не доехала
Alexander
даже если добавить Proxy m не спасает
Alexander
control $ \unlift -> do serv <- join $ atomically $ asum [ readTVar lock >>= check >> pure (async $ unlift $ act ws) убираем async и все ок
Cheese
без примера не могу помочь
Alexander
а с примером сможешь?
Cheese
смогу попытаться
Alexander
я не знаю сколько делать минимальный пример
Alexander
т.к. в соседнем месте такой же по структуре код работает
Cheese
у меня 100% случаев «ну почему же компилятор не выводит!?» заканчивались «хм, действительно, здесь нельзя вывести»
Alexander
serv <- asyncM $ control $ \unlift -> join $ atomically $ asum [ readTVar lock >>= check >> pure (unlift $ act ws) так работает asyncM :: MonadFork m => m a -> m (Async a)
Alexander
а не, тут все ок
Alexander
у act тип -> m a был, а должен был быть -> m ()
Alexander
что не следовало из текста ошибки
Alexander
о чем и ругань
Alexander
вот 2 примера выше, могу типы написать это что-то рядом с минимальным примером, если хочешь вечером могу компиляющееся сделать
Alexander
@cblp_su я вечером таки попробую сделать мимимальный пример
Зигохистоморфный
кто-то работал с https://hackage.haskell.org/package/compdata ? чем это лучше чем recursion-schemes?
Cheese
я попробую эти примеры поисследовать
Alexander
но повторюсь что rant о том, что если у тебя a :: () -> () -> m () и код control $ \unlift -> unlift $ a ()
Alexander
то тебе скажут не о том, что a применён к недостаточному числу агрументов (ошибка типов)
Alexander
а о том, что StM m () не равно ()
Alexander
это в общем-то понятно почему так, но очень неудобно
Alexander
этот пример отличался от обычного, тем, что ошибку типов другую я найти не смог
Alexander
о, в катипе мой патч уже приняли можно продолжать портирование на винду
Alexander
о вспомнил, что мне в идрисе очень нравилось, чего тут не хватает
Alexander
возможности всяких разных списков через [,,] делать
Alexander
т.е. какой-нить HList в haskell так не написать
Alexander
[a,b,c] :: HList [Int,String, Double] я там могу сделать
Alexander
мне конечно это мешало, т.к. он тупил и не хотел выбирать тип сам если векторы заимпорчены
Alexander
всякие применения applicative можно без idiom brackets или синтаксического оверхеда на <$> <*> писать
Viacheslav
bind оператор не прибит гвоздями к монадам
Viacheslav
точнее так, do нотация не прибита гвоздями к монадам
Зигохистоморфный
RebindableSyntax тоже вроде в haskell позволяет это делать
Alexander
Rebindable для списков вроде же не работает
Vasiliy
пришёл домой и пабырику накидал тот же кодец, что и на работе, на vinyl
Vasiliy
оказалось, что vinyl совсем не страшный, даже наоборот
Vasiliy
я вот про это, если что
Vasiliy
https://pastebin.com/EhXR9Scd
Alexander
vinyl очень приятный
Alexander
я очень сильно удивился когда узнал что он более общий чем HList
Alexander
а не наоборот
Vasiliy
там с туториалом проблемы - сходу TH, линзы, сиглтоны, дальше вникать как-то сложно
Vasiliy
а сегодня я кое-как не без вашей помощи дошёл до определения Rec, и оказалось, что всё очень даже доступно
Alexander
о, там tutorial появился?
Alexander
прикольно я его понял когда статью по Generic Programming Лё читал
Cheese
Rebindable для списков вроде же не работает
есть OverloadedLists, который немного смягчает синтаксис списков, но HList он не может
Alexander
я знаю, но это совсем не то
Alexander
замена [...] на fromList [...]
Cheese
да, это не решение, а шажок в сторону
Cheese
но можно ведь кортежами записывать HList
Vasiliy
кортежи в идрисе, кстати, тоже подсахарённые
Vasiliy
(a, b, x) = (a, (b, x))
Alexander
Vasiliy я сделал функцию в твоём подходе
Alexander
@cblp_su можно vector-fixed-hetero конечно
Alexander
если бы как в идрисе было, было бы нормално
Alexander
сейчас запосчу решение
Alexander
fs1 :: HList ts -> HList (Map A ts) -> HList (Map M ts) fs1 (_ :&: z) (y :&: ys) = (M y) :&: (fs1 z ys) fs1 HNil HNil = HNil вместо первого HList можно свою проксю запилить по которой матчить можно или сигнетоны
Alexander
можно undefined-ы хранить
Alexander
но vinyl лучше
Vasiliy
собственно, как я и подозревал, нужен какой-то объект, который будет подтверждать ts, в смысле, :&: он или HNil
Alexander
ну можно typeclass
Alexander
тогда Proxy ts будет достаточно
Alexander
proxy ts
Alexander
но инфа о ts нужна
Alexander
жалко typefamiliesdependencies недопилены
Alexander
можно бы было в Map f a :: b | f a -> b сделать было бы счастье
Vasiliy
а, то есть, сделать класс, инстансами которого будут Proxy '[] и Proxy (x ': xs) ?