кана
хочется уже какой-нибудь синтаксис для убирания бойлерплейта определения ньютайпа
Alexander
это точно собирается?
кана
да, конечно
Alexander
точно уж не "конечно"
Alexander
Я не знаю об этом конкретном акте, но к сенситивным данным относится очень много всего. Номера кредиток, персональные данные (в т.ч. адрес проживания физического лица, но не ИП), ИНН физического лица (но не ИП), паспортные данные. В свое время мы в логах чего только не находили, правда, почти все было "левым" мусором, очень похожим на, и наша система активно фолсила.
Ilya
это точно собирается?
нам этого к сожалению не проверить 😀 может GHC 9 сможет компилировать скрины...
кана
точно уж не "конечно"
а что тут может выглядит как несобираемое?
Alexander
а норм у тебя Serializable s нету
Alexander
нужно для все типов дерайвить, так можно, жа
Ilya
у меня на телефоне нету ghc все равно
я недавно поставил. там сразу много-много языков: https://play.google.com/store/apps/details?id=com.paprbit.dcoder&hl=en ещё год назад такого точно не было, когда я искал
Alexander
у меня и так телефон за часа три садится
Alexander
(наверное надо покемонов удалить)
Maxim
Хм, а вот давайте я ворвусь с вопросом про хаскель. Есть либа, в которой есть свой класс для строк, назовем его QStringValue, и у него есть инстанс для String. Что мне надо сделать, чтобы запилить инстанс IsString a => QStringValue a? потому что в IsString я вижу только fromString, но не наоборот или проще сделать QStringValue Text и не париться? просто хочется работать с OverloadedStrings и не писать всюду ("bla" :: String) когда передаю в либу
Maxim
и я тогда смогу передавать литералы туда где надо QString?
Cheese
хотя нет, это не исполнит желание
Cheese
нет, это желание ничего не исполнит
Maxim
ну вот инстанс IsString a => QStringValue a бы исполнил, нет?
Cheese
ну, можно сделать функцию s = id :: String -> String и писать (s"bla")
Maxim
фига костыли пошли
Maxim
странный тогда какой-то этот IsString
Maxim
проще выключить OverloadedStrings прагмой в отдельно взятом файле :)
Alexander
bla @ String ?
Maxim
для обычных стрингов там такой инстанс instance QStringValue (QtahP.String) where withQStringPtr = HoppyFHR.withCppObj
Maxim
и я вот понятия не имею как работает withCppObj
Cheese
ну вот инстанс IsString a => QStringValue a бы исполнил, нет?
далее если его написать, то не будет работать так, как ты хочешь, потому что конкретный тип всё равно не выводится
Cheese
Почему?
голова должна быть меньше хвоста
kosc
@maksbotan воу-воу, как давно ты стал хаскелистом?
Maxim
@hotkosc ты и тут меня нашел :D
kosc
НАСТИГ!
Cheese
странный тогда какой-то этот IsString
не странный. он ослабляет типизацию с одной стороны. но если ослабить с обеих, вывод типов не работает
Maxim
ну, загляни на мой хабр и посмотри даты публикаций. примерно тогда
Maxim
ну глобально у нас в проекте в кабал файле понавключена тонна расширений
Maxim
я знаю, об этом и говорил
Maxim
просто стало интересно есть ли способ это сделать
Cheese
но лучше не включать OverloadedStrings глобально
Maxim
почему?
Cheese
ты только описал ситуацию, в которой это приводит к проблемам
Maxim
надо же сравнить число ситуаций с проблемами с числом ситуаций с преимуществами
IC
я лучше TypeApplications буду включать, чем OverloadedXXX выключать
Maxim
кстати, а как TypeApplications понимает какой именно по порядку аргумент, если в функции несколько полиморфных аргументов?
Maxim
или мы пишем @ перед каждым аргументом отдельно?
IC
первый, потом второй...
IC
слева направо
Maxim
f @Int 5 @String "bla"? или f @Int @String 5 "bla"?
кана
f :: forall a b. a -> b -> a f @Int @String :: Int -> String -> Int
Maxim
ясно
Maxim
а если я хочу сказать только тип второго, а первый пусть сам угадывает?
кана
@_ вроде работает
Maxim
круто
кана
Хотелось бы иметь :t с выводом forall
Alexander
при explicitforall не выводит?
кана
Хм, не проверял, при rankn точно нет, а я всегда его включаю чет, даже без вложенных форалов
IC
λ> :set -fprint-explicit-foralls λ> :set -XTypeApplications λ> :t id id :: forall {a}. a -> a λ> :t id @Int id @Int :: Int -> Int
Ilya
Я тут свой первый пакет на Haskell запилил, про индексирование списков и других контейнеров. https://github.com/Toucandy/data-index Практическая ценность пока не ясна, скорее просто интересная идея. Хотя некоторые люди высказывали интерес. Буду рад любым замечаниям, в т.ч. по оформлению.
Leonid 🦇
оффлайн то нет
parket
Cloud9 глянь, есть ли там HS?
IC
что значит годные? чем не зашёл repl.it?
Ilya
liftIndex :: (t a -> ix -> b) -> (t a -> Index t ix -> b) liftIndex op t = t `op` ix t (!!) :: [a] -> Index [] Int -> b (!!) = liftIndex (List.!!) take :: Index [] Int -> [a] -> [a] take = flip (liftIndex (flip List.take))
да, у меня был такой liftIndex, только назывался wrap1 и wrap2 :) но не все функции оказались подходящего вида. например в Data.Sequence есть функция adjust, там замучаешься флипать. В итоге пришёл к выводу, что проще будет сделать через do-нотацию, чтобы было единообразно. Ну как работа с Reader.
кана
insertAt ix x s = run s $ List.insertAt <$> ix <*> pure x <*> pure s insertAt ix x s = run s $ liftA3 List.insertAt ix (pure x) (pure s)
Ilya
insertAt ix x s = run s $ List.insertAt <$> ix <*> pure x <*> pure s insertAt ix x s = run s $ liftA3 List.insertAt ix (pure x) (pure s)
ну да, наверное можно и так. но мне как-то do-нотация в итоге больше приглянулась. Правда плюс твоего кода в том, что не нужно Monad определять, а достаточно Applicative.
Ilya
ApplicativeDo
прикольно, выглядит как то что доктор прописал:) спасибо
A64m
надо голосование "кто читал ghc мануал?" интересно, будет ли хоть два человека
Anatolii
Я открываю периодически, но чтобы прямо читать нет
Alexander
то чтоя его не прочитал не значит что я его не читал
A64m
ну, я же не спрашиваю, кто прочитал. хотя-бы читал
Alex
Народ, а в чем идея функции lift? Вернуть такую же функцию, но которая работает с монадными значениями?
Alexander
это апи Control.Monad.Trans.Class
кана
ну я как минимум читал несколько страниц