A64m
а для тго чтоб эта уникальность сохраналось пишется тайп-фемели, которая сортирует, следит за уникальностью и т.д.
Зигохистоморфный
мб когда-то кто-то тут выложит прокаченную версию первоначальной идеи)
Alexander
блин ничего не работает : (
A64m
А разве до -XTypeApplications не надо было использовать прокси? То есть писать ip :: Proxy x -> a, а затем ip (Proxy :: Proxy "x") вместо ip @"x". Понимаю, что страшно, но раньше это не выглядело как грязные хаки...
не понял, этот тайпкласс же объявлен уже, ip такой какой есть, без прокси (для рассахаривания это не имеет значения, в корке @ был всегда)
Alexander
а не это я тупой
Alexander
go :: Rec (?init::Bool, ?value::String) -> String -> Rec (?init::Bool, ?value::String) go r n | r?init = rec False n
Alexander
вот такое как правильнго исеть?
A64m
мб когда-то кто-то тут выложит прокаченную версию первоначальной идеи)
этой идее 100 лет, раз никто ее до юзабельного состояния так и не довел, значит там явно что-то плохо работает
A64m
скорее всего слишком много аннотаций требуется, это наверное первое что заметно
Alexander
@A64m_qb0 ^ как сделать гард с init там?
A64m
@A64m_qb0 ^ как сделать гард с init там?
r ? ?init вроде (не проверял)
Alexander
Qu.hs:16:7: error: • Unbound implicit parameter ?init::Bool arising from a use of implicit parameter ‘?init’ • In the expression: ?init если я просто ?init использую
Alexander
а
Alexander
понял
Alexander
Qu.hs:16:11: error: • Could not deduce: ?init::Bool arising from a use of implicit parameter ‘?init’ from the context: (?init::Bool, ?value::String) bound by a type expected by the context: (?init::Bool, ?value::String) => Bool at Qu.hs:16:7-15 • In the second argument of ‘(?)’, namely ‘?init’ In the expression: r ? ?init In a stmt of a pattern guard for an equation for ‘go’: r ? ?init
Alexander
:(
A64m
а если go Rec и потом просто ?init ?
Alexander
• Unbound implicit parameter ?init::Bool arising from a use of implicit parameter ‘?init’ • In the expression: ?init In the expression: if ?init then rec False n else rec False (?value <> sep <> n) In an equation for ‘go’: go r n = if ?init then rec False n else rec False (?value <> sep <> n)
Alexander
а
Alexander
надо было Rec писать
Alexander
чтобы контекст создать
A64m
тут наверное то же, что и всегда бывает с GADT и паттерн-матчингм?
A64m
хотя там он пишет про взрыв мозга обычно
Alexander
inter :: String -> [String] -> String inter sep xs = extract $ foldl go start xs where go :: Rec (?init::Bool, ?value::String) -> String -> Rec (?init::Bool, ?value::String) go Rec n = if ?init then rec False n else rec False (?value <> sep <> n) start :: Rec (?init::Bool, ?value::String) start = Rec where ?init=True; ?value="" rec :: Bool -> String -> Rec (?init::Bool, ?value::String) rec b s = Rec where ?init=b; ?value=s extract :: Rec (?init::Bool, ?value::String) -> String extract Rec = ?value
Alexander
ваши предложения по уменьшению кода
Alexander
щас попробую с typeapplications убрать rec
Alexander
и вернуть guard (уже получилось)
Alexander
@A64m_qb0 может знаешь что в where сделать если у меня внутри кода
Alexander
с let мне кажется ему мозг взорвёт
A64m
если я правильно помню страдания с этим всем, let почти всегда лучше where работает, а case строго лучше всего (но он самый уродливый из всех конечно)
Alexander
а как сделать
Alexander
вот я хочу rec False n на инлайн конструкцию заменить
Alexander
| ?init = let ?init=False; ?value=n in Rec @ (?init::Bool, ?value::String)
Alexander
скомпилялось
Alexander
вообще круто становится
Alexander
(foldl go start xs) @ (?init::Bool, ?value::String) ? как тут правильно прменять?
Alexander
все не выучу
Alexander
а нафиг тут не надо, из контекста все есть
A64m
? это просто же чтоб матчинг по Rec не лепить - если где-то выше по скоупу заметчено то все, имена есть в скоупе, это вроде Foo{..}
A64m
а ? чтоб селекторы имитировать
Alexander
угу
Alexander
inter :: String -> [String] -> String inter sep xs = case foldl go start xs of Rec -> ?value where go :: Rec (?init::Bool, ?value::String) -> String -> Rec (?init::Bool, ?value::String) go Rec n | ?init = let ?init=False; ?value=n in Rec | otherwise = let ?value = ?value <> sep <> n in Rec start :: Rec (?init::Bool, ?value::String) start = Rec where ?init=True; ?value=""
Alexander
финальная версия, наверное ещё можно у start убрать аннотацию и заинлайнить
Alexander
жалко нельзя писать {Rec where ?init=True; ?value=""} посреди строки
Alexander
тогда бы вообще круто было
Зигохистоморфный
можно же let? это же выражение
Кабачок
тоже об этом подумал
A64m
ну (let ?init=True; ?value="" in Rec) то можно
Ferrum
а есть какой-то способ заставить cabal напихать все модули из hs-source-dirs в exposed-modules, кроме как через init? про hpack знаю
Alexander
let ещё взорвётся
Anonymous
что значит этот вопросительный знак?
A64m
который? там два разного смысла
Кабачок
черная магия, см. выше по треду
Alexander
да с let хорошо
Alexander
блин как такое использование implicit в голову прийти может?
A64m
могу нагуглить почту автора
Anonymous
Там чо, у конструктора Rec имплиситы? (дальше кода не листал)
Кабачок
жалко нельзя писать {Rec where ?init=True; ?value=""} посреди строки
может стоило where тоже сделать выражением?
Кабачок
эдакий flip let
Alexander
(let ?init=True; ?value="" in Rec) так написал норм
Alexander
жалко у go сигнатуру не убрать
A64m
может стоило where тоже сделать выражением?
так его сначала и придумали, но в хаскель он попал в версии миранды, а там с выражениями не очень дела обстояли
Anonymous
может стоило where тоже сделать выражением?
При всём желании не сделаешь - парсить-то как?
A64m
?init=True
это синтаксис имлицитов
A64m
При всём желании не сделаешь - парсить-то как?
с обязательными скобками, например
Anonymous
Область захвата where включает параметры функции, которые вне выражения - они часть биндинга.
Alexander
кстати во что ?init=True превращается?
Alexander
instance IP init Bool where ip = True?
Anonymous
ого 🤔
Alexander
/me пошёл читать мануал
Alexander
инетересно почему я этого раньше не делал, все ж почеловечески написано
Alexander
про то что я ghc manual открыл
Alexander
про имплиситы
A64m
не я один обратил внимание на это письмо в рассылке, оказывается. даже баги репортят https://ghc.haskell.org/trac/ghc/ticket/12507
A64m
а нет, на самом деле это можно проследить до гиттер-обсуждения
Зигохистоморфный
а что это делает? ImplicitParams
A64m
позволяет локальные инстансы объявлять, правда только одного класса