andrei
call/cc
Андрей
call/cc
andrei
👌
A64m
т.е. как в схеме?
A64m
скоро будет специальный ghc, который компилирует медленнее ghc (eta скомпилированная eta)
Alexander
eta блин..
kosc
Объясните пожалуйста, что означает
{-# LANGUAGE OverloadedStrings #-}
в некоторых исходниках Haskell. Очень часто встречается.
Denis
О, только что читал, он превращает все строки, например "foo" в вызов функции fromString "foo"
Alexander
строковые литералы конвертируются в fromString "literal"
Denis
и если есть инстанс тайпкласса то все скомпилится
Vladislav
Так же как с числовыми происходит и fromInteger
kosc
А, понял, спасибо.
Евгений
Влод
или id в случае стринга
Евгений
Грустно :(
Alexander
@elemir90 как повезёт
Alexander
без оптимизаций в рантайме, с оптимизациями может и в заинлайнить все
Alexander
ну и констрантные строки все равно оптимизируются хорошо
кана
оу, а что `~~` значит?
по скрину выглядит как ~ только для полиморфного каинда k->*
Alexander
в либе какой-нить синоним/семейство, я чета такого не помню
A64m
это вроде ~ с более общим кайндом
Alexander
а
Alexander
круто
Vladislav
~~ это гетерогенное равенство типов
Vladislav
`(a :: k1) ~ (b :: k2)`
если k1 /= k2, kind error. если a /= b, constraint unsatisfied
`(a :: k1) ~~ (b :: k2)`
если k1 /= k2, constraint unsatisfied. если a /= b, constraint unsatisfied
Vladislav
Если проводить аналогию на тёрмах
`(a :: t1) == (b :: t2)`
если t1 / = t2, type error. если a /= b, False
f ::
(Typeable t1, Typeable t2, Eq t1) =>
t1 -> t2 -> Bool
f a b = case testEquality (typeOf a) (typeOf b) of
Nothing -> False
Just Refl -> a == b
если t1 /= t2, False. если a/=b, False
кана
ага, понятно, спасибо
Denis
У меня в .ghci есть строчка :set -XOverloadedStrings. При этом stack build репортит ошибки компиляции. Если выполняю stack ghci - все окей. Почему так?
Alexander
потому, что ExtendedDefaultRules
Alexander
в общем ghci подбирает типы по умолчанию, обычная сборка - нет
A64m
из объяснения не понятно, включено ли расширение при обычной сборке вообще
Alexander
а ну да
Denis
Где посмотреть?
Alexander
{-# LANGUAGE OverloadedStrings #-} в заголовке файла
Alexander
или default-extensions: OverloadedStrings в кабал файле
Denis
Там нет
Denis
там тоже нет
Влод
не хочешь включить?
Denis
Видимо хочу, я и хотел это понять, где и что надо добавить
Oleg
или default-extensions: OverloadedStrings в кабал файле
Denis
да понял я )
Denis
спасибо, все ок
Alexander
я люблю per file добавлять
Alexander
тогда оно с ghci совместимо всегда
Denis
А я и не против добавлять, просто хотел разобраться почему так происходит
кана
потому что :set -X в .ghci включает расширения только в ghci, поэтому и код в ghci работает. А во время сборки .ghci конечно не читается
{-# LANGUAGE #-} включает в том файле, в котором он находится, и во время сборки
Denis
Cheese
кана
ну так термин (уже существущий) - объект, подходящий под определение, нет?
Cheese
термин — просто идентификатор определения
Cheese
слово "козяблик" — просто имя для множество козябликов
Vladislav
вот бы сейчас дескриптивность/прескриптивность языка пообсуждать
Cheese
Denis
я per file добавляю если у меня один файл
Denis
далее в кабал
Vladislav
я думаю per file нормально для библиотек, но мучительно для приложений
Denis
какая разница?
Denis
я наскидку только пару расширений могу назвать, которые периодически хочется отключить
Denis
может вот их per file, а остальное можно и поглобальнее
Vladislav
разница с организации процессов, в библиотеку может захотеть законтрибьютить человек, который в первый раз видит код, не обязательно знакомый со всеми расширениями, ему поможет этот список не втыкать три часа, почему что-то незнакомое компилится
Vladislav
а в default-extensions не каждый и заглянет
Vladislav
+ у некоторых тулинг ломается без этого перечня, что опять же вина тулинга, но контрибьютеров таким образом не хочется прогонять
Vladislav
еще это способ не заставлять людей изучать расширения, которые используются только в некоторых модулях
Vladislav
опять же, в приложении со стабильной командой это не нужно (пусть возьмут да изучат), для случайных контрибьютеров это барьер
Denis
ну фиг знает, если у тебя в библиотеке SuperSayanExtensionPack, то per file мало поможет
Vladislav
если кто-то решит подправить этот 1 файл из 5, вот ему и не понадобится расширение новое изучать
Vladislav
а если код хорошо организован модульно, то есть шанс, что только 1 файл править и придется
Vladislav
не, ну понятно, что люди не так оперируют, мол "пойду изучу всё, что в default-extensions", но это может снизить потенциальный confusion
Vladislav
А про разный язык в каждом модуле это реально проблемно. Бывает включишь GADT-ы, а работающий до этого код ломается (потому что он на -XNoMonoLocalBinds полагался, который по умолчанию)
Vladislav
Или там со -XScopedTypeVariables
A64m
ну потому что хаскель это два языка а не сколько сочетаний расширений, конечно
Vladislav
В общем для приложений очевидно лучше в default-extensions, а для библиотек я не знаю какой трейд-офф лучше.
Vladislav
A64m
а скоупед тайп вроде ничего особо не поломаешь, локальные сигнатуры с параметрами это экзотика все-таки
Vladislav
экзотика, пока не сломается
A64m
В смысле?
старый который переэмель с лет-полиморфизмом и тот, когда включаются какие-то поверхностные проявления FC и, соотв. вывод типов не Дамас-Милнер становится
Vladislav
Ну тут явно больше градаций