Vladislav
Через 2 релиза все равно сломаю
Vladislav
Т.е. если не включить сейчас, то через 2 релиза код сломается.
кана
@kana_sama зацени https://stackoverflow.com/questions/49628762/lifting-generalization
ага, писал такое тоже, но пользовать таким нереально, ошибкие тоже непонятные, выводится иногда не то и тд
Зигохистоморфный
Всегда можно сделать n+1 имея liftN liftN+1 = (<*>) + liftN
A64m
A64m
(причем заброшенный уже, вроде)
кана
[большая горечь]
A64m
To do this, we formalize the notion of kind, writing * for the kind of all types and k1 -> k2 for the kind of a constructor which takes something of kind k1 and returns something of kind k2. This notion comes is motivated by some theoretical work by Henk Barendregt on the subject of `Generalized type systems'; Do not confuse this with the use of the symbol * in a certain well-known functional language where it represents a type variable. These things are completely different!
.sυλ
Снова по линзам вопрос. Так выглядит функция, изменяющая объект.
.sυλ
А как должна выглядеть аналогичная, которая получает из него данные?
Aleksei (astynax)
game ^. boss . health
.sυλ
Не выходит
A64m
емнип use (boss.health)
кана
game ^. boss . health
это же стейт
кана
health' <- use $ boss . health можно сразу и менять, и получать: health' <- boss.health <-= 10 как заметил @astynax, можно через gets health' <- gets $ view $ boss.health собственно use = gets . view
.sυλ
В чем разница между runStateT и execStateT? Последний не пропускает эффекты IO?
кана
run отдает и стейт, и результат вычисления в монаде exec отдает только стейт в монаде (когда результат вычисления не важен)
кана
это почти ко всем основным mtl-монадам относится
кана
у своих я тоже такого нейминга придерживаюсь
кана
есть еще evalStateT, который отдает только результат
.sυλ
run отдает и стейт, и результат вычисления в монаде exec отдает только стейт в монаде (когда результат вычисления не важен)
Функции IO () работать в exec не будут? Почему-то у меня они все глохнут при вызове execStateT
кана
будут, покажи код
Alexander
будут конечно работать
кана
program :: StateT Int IO () program = do liftIO . putStr $ "inner state: " liftIO . print =<< get modify (+ 10) main :: IO () main = do state <- execStateT program 20 print $ "result state: " ++ state вывод: inner state: 20 result state: 30
Alexander
а http://hackage.haskell.org/package/gtk норм или есть что то более актуальное?
Aleksei (astynax)
Может, resultStateT voidStateT были бы понятнее?
run/exec/eval - глаголы. result и void - не то глаголы, не то странные существительные :)
Anonymous
run/exec/eval - глаголы. result и void - не то глаголы, не то странные существительные :)
Разве лингвистика важнее значения/смысла? Конечно, run, exec уже в либе. Да и документацию поднять нетрудно.
кана
Ну имхо от voidState интуиции не больше, чем от execState
Aleksei (astynax)
Разве лингвистика важнее значения/смысла? Конечно, run, exec уже в либе. Да и документацию поднять нетрудно.
run у всех монадок. Вот exec/eval можно было назвать иначе. Но логика есть и в текущем именовании - exec делается ради эффекта, а eval ради вычисления значения
Alexander
А я всегда путаю eval / exec 😞
A64m
у eval должен быть результат, очевидно
A64m
так что перепутать сложно
A64m
вообще же eval и exec, наверное, от того, что mtl происходит из пейпера про модульные интерпретаторы
Alexander
> Но логика есть и в текущем именовании - exec делается ради эффекта, а eval ради вычисления значения Вот это, пожалуй, поможет мне запомнить, кто из них a, а кто s
A64m
да, и * и бокс из пейпера Барендрегта взял и применил (когда изобретал конструктор классы) Марк Джонс - автор хаскельных фич 90 которые так ненавидят любить и любят ненавидить хаскелисты
A64m
можно считать что все виновные установлены, Тернер и Милнер не при чем
A64m
бокс, кстати, не имеет отношение ко всяким боксед-лифтед, это просто квадратик из Барендрегтовского пейпера словом
Антон
раньше было 0 :: Int :: * :: BOX терм тип кайнд сорт теперь 0 :: Int :: Type :: Type :: Type :: Type терм и типы ол зе вей даун
А почему не стали делать, как в Idris — Type : Type 1 : Type 2: ...? А то меня самовложенность универсума напрягает
A64m
> Why do this? One alternative is to go the route of Coq and Agda and have an infinite tower of type universes. But, this adds a lot of complexity. These languages take this route because * :: * makes a language inconsistent as a logic. However, Haskell is already inconsistent as a logic (because of undefined and GHC.Exts.Any) and so we don't have to worry about a new source of inconsistency. Furthermore, the type safety of Haskell does not depend on its own consistency -- unlike Coq and Agda, Haskell relies on the consistency of a coercion language, which is not threatened by * :: *
Антон
ух ты, ещё вот так можно λ> instance Num () where fromInteger _ = () λ> 2 == 3 True
Не плоди сиротских инстансов, бессердечный!
Vladimir
Это всё очень сложные вопросы. Можно вопрос поглупее и попроще? Какими значениями населён в этих-ваших идрисах и агдах тип 7? Или 5? Или 92?
Cheese
Не плоди сиротских инстансов, бессердечный!
это грязный хак. очень грязный
A64m
рано читать перестали > the type safety of Haskell does not depend on its own consistency -- unlike Coq and Agda, Haskell relies on the consistency of a coercion language, which is not threatened by * :: *
A64m
короче, вложенными универсумами в хаскеле по памяти не проедешь
Alexander
меня печалит gtk
Alexander
есть хорошие альтернативы чтобы именно с хаскеле дружили хорошо?
Alexander
А то я беру один из контейнеров виджета и он виджет и не контейнер
Alexander
приходится тайпкастить
Cheese
есть хорошие альтернативы чтобы именно с хаскеле дружили хорошо?
qtah, но сложные вещи в Хаскеле выразить бывает сложнее, чем на языке оригинала
Cheese
есть хорошие альтернативы чтобы именно с хаскеле дружили хорошо?
Антон продвигает такой паттерн: писать команды для UI на своём любимом языке, а интерпретатор для них — на том, где есть GUI фрэймворк
Cheese
а где почитать про такой подход?
https://ruhaskell.org/posts/talks/2017/04/06/haskell-anyway.html
Alexander
не, логика конечно правильная, но имхо это значительное усложнение архитектуры
Alexander
собственно что-нибудь кровавое и энтерпрайзное наверно только так и надо
Cheese
получается типичный вебсайт )
не совсем. с сайтом сложнее потому, что связь с сервером крайне ненадёжная
Alexander
веб-приложения с оффлайн режимом это давно не новость
Alexander
но я имел виду скорее self-hosted прямо в соседнем процессе
Alexander
а вместо браузера электрон
Cheese
да, это один из вариантов
Alexander
тут еще такая фишка, что десктоп-разработчики решают проблему слишком сильной связанности фронтенда и бэкенда, а веб-разработчики недостаточной
Alexander
типа дублирования валидаций, рассинхронизации переводов и подобного
Alexander
а если мы говорим о том что на фронтенд выносится самый минимум, то получается то же что и линковка фреймворка через FFI в свой любимый язык имхо
Alexander
ну это не бесплатная борьба
Alexander
чем слабее связанность тем хуже DRY
Alexander
это в общем то даже доказательств не требует
Alexander
тащемто кровавый энтерпрайз именно потому кровавый, что им приходится бороться со связанностью уже довольно дорогими способами
Bohdan
А можно ли считать нелюбовь к хаскеллю детектором макакичей?
Bohdan
А то я так и не заценил, похоже
Слава
А можно ли считать нелюбовь к хаскеллю детектором макакичей?
А кто это такие? Знаю я одного Макакия Макакиевича Резуса, эсквайра, но он медийщик, как бы
.sυλ
А как применить Traversal' к многомерным спискам? Положим, есть _field :: [[Object]] Object { _param :: Int} Как можно из _field извлечь [[_param]]?
.sυλ
toListOf работает только для одномерных же, нет?
.sυλ
Или сработает элементарный map к field.traversal?
Alexander
в чем проблема сделаеть join многомерного списка?