Alexander
dynamic scope!
Зигохистоморфный
а можно простой простой пример?
Alexander
чтобы как в древнелиспах было
Alexander
foo = ?x + 1
Alexander
там будет ?x который в динамическом скоупе
Зигохистоморфный
хм https://github.com/duairc/implicit-params
Alexander
или например sort :: (?cmp => a -> a -> Ordering) => a -> a
Alexander
будет сортировать той cmp которая в скоупе
Alexander
динамическом
Зигохистоморфный
но они будут жить теперь в констрейнте типа https://wiki.haskell.org/Implicit_parameters
Зигохистоморфный
разница в том, что теперь явно не пишем cmp как параметер функции?
Alexander
да
Alexander
@A64m_qb0 а хороший пример с инстансами есть?
A64m
локальные инстансы на имплицитах, я сейчас вспомнил, поправили как баг
Зигохистоморфный
да
выложи потом рабочий гист)
Alexander
с cmp пример в документации лежит
Alexander
я в первый раз в жищнию их юзал
Зигохистоморфный
ясно! https://ocharles.org.uk/blog/posts/2014-12-11-implicit-params.html
Кабачок
чтобы как в древнелиспах было
в елиспе до сих пор так 🌚
Alexander
=)
Alexander
он не древнелисп разве?
Aleksei (astynax)
elisp - страннолисп, лисп-в-себе
Алексей
По моему не так чтобы уж совсем древнелисп, динозавром, может и видел, но трилобитов точно не застал
Aleksei (astynax)
В Elisp нету лексического скоупинга. Этим он похож на первые лиспы. В остальном вполне себе нормальный (для лиспа) узкоспециализированный диалект.
Зигохистоморфный
https://markkarpov.com/post/short-bs-and-text.html
Alexander
text-utf8 чисто haskell-ный или с icu?
Алексей
А это, разве, не заброшенный эксперимент по портированию text на UTF8?
Зигохистоморфный
чот не пойму зачем это http://tech.frontrowed.com/2017/11/01/rhetoric-of-clojure-and-haskell/
Aleksei (astynax)
А lexical-binding тогда что? Какой-то хак?
(let ((a 1)) (let ((f (lambda () (print a)))) (let ((a 2)) (funcall f)))) => 2
Aleksei (astynax)
В имаксе динамический биндинг. А lexical-binding - статический.
Зигохистоморфный
@A64m_qb0 если это foldl в Черче https://hackage.haskell.org/package/foldl-1.3.3/docs/Control-Foldl.html#t:Fold то какой будет foldr в Черче? есть ли такая либа?
Aleksei (astynax)
А lexical-binding тогда что? Какой-то хак?
С 24.1 можно для модуля включить лексический биндинг (вместо динамического) - той самой переменной lexical-binding
Anonymous
@A64m_qb0 если это foldl в Черче https://hackage.haskell.org/package/foldl-1.3.3/docs/Control-Foldl.html#t:Fold то какой будет foldr в Черче? есть ли такая либа?
А почему правая свёртка в church encoding должна выглядеть как-то по-другому? Тем более, что там 1 функцию надо модифицировать, чтобы она правую свёртку делала, а не левую (через правую). https://hackage.haskell.org/package/foldl-1.3.3/docs/src/Control-Foldl.html#fold
Зигохистоморфный
ну это понятно что в Fold поменять первый аргумент
Зигохистоморфный
(x -> a -> x) => (a -> x -> x)
Зигохистоморфный
но может есть специфика?
A64m
вопрос как-то странно сформулирован, но я так понял. что требуется https://hackage.haskell.org/package/folds
Anonymous
1) Зачем? 2) я думаю, что лучше было бы в обоих свёртках иметь (a -> x -> x).
Зигохистоморфный
интересно можно сделать катаморфизм с поведением левой свертки?)
A64m
т.е. записать левую через правую? Да
A64m
она прямо в base так и написана
Зигохистоморфный
нет записать катаЛ через ката
Кабачок
1) Зачем? 2) я думаю, что лучше было бы в обоих свёртках иметь (a -> x -> x).
различаю свертки только по порядку аргументов
Anonymous
Good luck in erlang
Anonymous
Я каждый раз лезу в repl, чтобы понять, в каком порядке должны быть аргументы
Aleksei (astynax)
Там же вся мнемоника в позиции аккумулятора
Aleksei (astynax)
(((1 + 2) + 3) + 4) vs (1 + (2 + (3 + 4))) + то коммутативен, но не все же функции таковы
Anonymous
a -> x -> x предпочтительнее, так как многие операции имеют такую форму
Aleksei (astynax)
Конечно нет
Aleksei (astynax)
Map.insert
Anonymous
Когда у тебя все аргументы у функций закончились уже неделю назад и ты сделал import Data.Composition ((.:), (..:)), это становится неудобно
Anonymous
На то, чтобы он торчал посреди моего кода, как шест в поле, очевидно
A64m
вот, нашел письмо от изобретателя рекордов на имплицитах https://mail.haskell.org/pipermail/haskell-cafe/2013-May/108334.html
Anonymous
Это то, что я называю чёрной магией. Я ещё видел, как люди упаковывали что угодно в (), а потом распаковывали
A64m
все-таки тут упаковывается как раз в то, что и предназначено для упаковывания таких вещей
Anonymous
Map.insert
> Map.insert :: Ord k => k -> a -> Map k a -> Map k a ~ a -> x -> x foldr (uncurry Map.insert) Map.empty kvPairs
Aleksei (astynax)
foldl' же
Anonymous
Вопрос. Если где-то в скоупе появятся ещё несколько неявных параметров (?callStack, например), оно их тоже захватит и будет таскать с собой? Как это вообще физически - т.е., на уровне Core - работает?
Anonymous
foldl' же
А в этом случае придётся пихать flip. Который в не имеет отношения к логике программы в принципе, но занимает место и отвлекает глаз.
A64m
каким типом проаннотировать - то и захватит.
Anonymous
Т.е., в случает аннотации CallStack => оно будет таскать за собой ?callStack?
A64m
тип Rec параметризован захватываемыми имплицитами
Anonymous
А потом после распаковки, этот ?callStack перекроет - или, что лучше, просто окажется в поле зрения вызова, который печатает текущий стэк?
A64m
тут все как в этих примерах со списками обернутых интов, булов и прочего, где обертка, например, классом Show параметризуется
Anonymous
> data Record fields where > Rec :: fields => Record fields Т.е., здесь вместе с Rec будет таскаться пачка словарей? Я правильно понимаю, что ты не управляешь списком захвата при этом?
A64m
что значит "не управляешь"?
Anonymous
Т.е., оно захватит все имплиситы, которые будут в поле зрения
A64m
ну вот Box Show что, предполагается что в случае Box 42 захватит все словари для интеджера а не только Show?
Anonymous
А, да. У него же эти словари фиксированы в виде параметра типа. Не углядел.
Зигохистоморфный
ну и еще поведение на бесконечных списках у foldl и foldr разные
Anonymous
Я всё более склоняюсь к foldMap (uncurry Map.singlenton) kvPairs
A64m
из-за этого там и вывод типов не фонтан
кана
Map.insert
почему, Map.insert тоже такой же
кана
foldr (uncurry Map.insert) Map.empty [("a", 1), ("b", 2)] => fromList [("a",1),("b",2)]