Кабачок
Haskell без композиции — деньги на ветер
Зигохистоморфный
хотите перформанс - юзайте multiset MS.toOccurList . MS.filter isAlpha . MS.fromList $ "test as test"
Ignat
прикольн))
Клёвый язык. 2 часа пытаюсь Int от пользователя в ф-ю передать
Taras 🦀
😂 прям как я вхожу в регулярки
@xgrommx Там, судя по гуглу, довольно популярный запрос %) Как IO Int в Int перевести
Ignat
нужна какая-нибудь паста
Ignat
про «ты СОВЕРШЕННО не понимаешь сути IO»
Зигохистоморфный
про «ты СОВЕРШЕННО не понимаешь сути IO»
думаю про монадки было бы лучше)
Ignat
ну монадки слишком абстрактны
Зигохистоморфный
ну монадки слишком абстрактны
в его случае он вообще поведения комонады хочет w a -> a
Ignat
да ето так
Ignat
ну если не скатываться совсем в оффтопик
Ignat
то имея в do-нотации строку уровня myInt <- getIntFromSomewhere
Ignat
можно написать рядом let squaredInt = sqr myInt
Ignat
видимо, этого @valsaven и хочет
Зигохистоморфный
постановки задачи даже не увидел
Ignat
ну «передать Int от пользователя в функцию»
Ignat
звучит как «получить Int извне, преобразовать чистыми функциями и выплюнуть обратно»
Ignat
насколько позволяют понять мои телепатические способности
Vasiliy
лучше конечно разобраться почему, если интересно (https://t.me/haskell_learn), иначе это будет до следующей подобной "проблемы"
Да, спасибо за ссылку, пожалуй сначала что-то такое пройду лучше. С наскоку, видимо, не попрототипировать. На глупые проблемы слишком много времени уходит
Тем более там IO в самом конце))
Зигохистоморфный
@valsaven вот тебе пример с передачей Int process = do n <- print "Input count of numbers " >> getLine case (readEitherSafe :: String -> Either String Int) n of Left s -> print s >> process Right v -> do xs <- T.for [1..v] $ \ i -> do print $ "Input number #" ++ show i getLine case traverse (readEitherSafe :: String -> Either String Int) xs of Left s -> print s Right xs'' -> print $ sum xs'' main :: IO () main = process
Artem
Скажите, пожалуйста, кто-нибудь понимает, как поживают OverloadedRecordFields? после февраля 2017 (эпический бой про линзы https://github.com/ghc-proposals/ghc-proposals/pull/6) ничего не видно, в том числе, в ghc wiki
A64m
Скажите, пожалуйста, кто-нибудь понимает, как поживают OverloadedRecordFields? после февраля 2017 (эпический бой про линзы https://github.com/ghc-proposals/ghc-proposals/pull/6) ничего не видно, в том числе, в ghc wiki
ну чтоб пользоваться ORF-машинерией для выбора геттеров леблами нужно свой сиротский инстанс определять, можно конечно не пользоваться лейблами и писать геттеры с аннотацией типом-символом
A64m
т.е. механика орфовская из пропозала вся в 8.2 есть, только инстанс для лейблов не прошел
Artem
собственно вопрос, есть ли новости, когда и в каком виде пройдёт?
A64m
но есть ли в этом смысл? сам функционал у ORF довольно убогий, не лучше ли какой-нибудь generic-lens использовать?
A64m
собственно вопрос, есть ли новости, когда и в каком виде пройдёт?
нет, новостей никаких нет, никто над этим не работает
A64m
ну, вернее, можно предположить что работа Гендри над абстрактными линзами это часть работы по ORF
Artem
я не хотел бы обсуждать линзы: изначально ORF рекламировался, как более гибкий механизм геттеров (условно, избавление от требования уникальности имён). Разница с линзами такая, что геттеры это entry-level средство Haskell, в то время как линзы это что угодно,но не entry-level (называйте advance или ка квам нравится)
Artem
ну, это же полу решение, пользоваться ими как раньше нельзя
Artem
(Duplicate)
A64m
геттерами как функциями нельзя (без аннотации типа, там такой убогий близорукий TDNR), а в пм с вайлдкартами можно, я так их всегда восновном и использовал
A64m
а роу-полиморфизм для геттеров из ORF в 8.2 и сам по себе не энтрилевельный, там уже что с линзами что без линз. Без линз просто убого все и неудобно
Artem
да, меня интересует использование как функциями (собственно, название "геттер" это в первую очередь и подразумевает с моей точки зрения)
A64m
ну вот чтоб использовать как геттер надо сиротский инстанс в приложении объявить
Artem
роу-полиморфизм не нужно понимать новичку чтобы этим пользоваться, как не нужно понимать внутреннее устройство GHC, чтобы им что-то компилировать
Artem
да, вопрос был про то, когда это требование будет снято и какие первые шаги на когда намечены, ведь это всё было в начальном плане, как я понимаю
A64m
не нужно, но сигнатуры и типы в ошибках нужно как-то понимать (не обязательно глубоко) линзами тоже не приходя в сознание можно пользоваться с теми же оговорками
A64m
да, вопрос был про то, когда это требование будет снято и какие первые шаги на когда намечены, ведь это всё было в начальном плане, как я понимаю
никогда. в первоначальном плане это было, но инстанс не успел в 8.0, а до 8.2 уже кучу библиотек использующих лейблы понаписали, значительную часть из них этот инстанс сломал бы, общественность растревожилась и инстанс заклевала. Конец истории
A64m
ну, может можно протащить сиротский инстанс в отдельном модуле в base, который все равно в библиотеках не используешь, также можно и подругому ORF сделать, но вроде никто не делает
A64m
ORF Гендри и так раза 4 делал прежде чем он в нынешнем виде попал в 8.2, я что-то сомневаюсь, что 5й раз будет делать
Artem
последнее что видно от него на эту тему это подпиливание DRF (октябрь 2017) https://github.com/ghc-proposals/ghc-proposals/pull/84
Artem
ну вот чтоб использовать как геттер надо сиротский инстанс в приложении объявить
а пример, кстати, есть где-то в общедоступном месте? я вот искал и не нашёл. Там instance IsLabel нужен?
A64m
последнее что видно от него на эту тему это подпиливание DRF (октябрь 2017) https://github.com/ghc-proposals/ghc-proposals/pull/84
да, но это никак не улучшает ситуацию с геттерами (наоборот, ухудшает)
A64m
{-# LANGUAGE AllowAmbiguousTypes , FlexibleInstances , MultiParamTypeClasses , ScopedTypeVariables , TypeApplications , DuplicateRecordFields , OverloadedLabels , FlexibleContexts #-} module Records where import GHC.OverloadedLabels import GHC.Records instance HasField x r a => IsLabel x (r -> a) where fromLabel = getField @x как-то так это должно все выглядеть
Artem
{-# LANGUAGE AllowAmbiguousTypes , FlexibleInstances , MultiParamTypeClasses , ScopedTypeVariables , TypeApplications , DuplicateRecordFields , OverloadedLabels , FlexibleContexts #-} module Records where import GHC.OverloadedLabels import GHC.Records instance HasField x r a => IsLabel x (r -> a) where fromLabel = getField @x как-то так это должно все выглядеть
о, здорово, спасибо! примера на видном месте так и не нашёл :( кстати, опытным путём установлено, что AllowAmbiguousTypes, OverloadedLabels и FlexibleContexts можно опустить; тем не менее, выглядит, конечно, печально…
Artem
получилось вот как-то так: {-# LANGUAGE FlexibleInstances , MultiParamTypeClasses , ScopedTypeVariables , TypeApplications , DuplicateRecordFields , OverloadedLabels #-} import GHC.OverloadedLabels import GHC.Records data Person = MkPerson { name :: String } data Dog = MkDog { name :: String } instance HasField x r a => IsLabel x (r -> a) where fromLabel = getField @x bark :: Dog -> IO () bark d = putStrLn $ "Arrg from " ++ #name d main = bark $ MkDog "Spike"
A64m
ну часть расширений нужна только в модуле где инстанс объявлен для самого объявления, часть наоборот для того чтоб рекорды использовать, для инстанса не нужных
A64m
OverloadedLabels как раз нужны там где соотв. синтаксис используется
Artem
в примере выше же есть #name или речь о каком-то другом синтаксисе?
A64m
в примере выше же есть #name или речь о каком-то другом синтаксисе?
есть, так что не должно без OverloadedLabels компилироваться
Artem
ну вот компилируется…
A64m
наверное просто ранее скомпилированное работает или что-то вроде
Artem
да, извиняюсь, это я в GHCi пробовал с включённым флагом
Антон
Ребят, я дико извиняюсь, но что это за лейблы и как они связаны с линзами?
A64m
Ребят, я дико извиняюсь, но что это за лейблы и как они связаны с линзами?
синтаксис #foo который рассахаривается в вызов метода класса fromLabel @"foo" т.е. можно написать инстанс который будет линзу для поля с именем foo или геттер как в примере выше подставлять
Artem
Ребят, я дико извиняюсь, но что это за лейблы и как они связаны с линзами?
более подробное объяснение тут https://github.com/ghc-proposals/ghc-proposals/pull/6#issuecomment-276150270
a66ath
Нас 600
Нас 600
элита 😍
Dmitry
давайте всё-таки поговорим о том, когда не стрёмно использовать type family , а не data family
Dmitry
иногда они нужны
Dmitry
есть какие-то best practices / или заметки, что избегать в каких случаях
Alexander
я почти никогда не использую data family
Dmitry
ну помимо ассоциированных?
Dmitry
или ты даже и в ассоциированные делаешь type family, а потом везде прокси таскаешь или type applications ?
Dmitry
так-то понятно, что без data family удобнее было бы.
Sergey
народ, haskell же не делает откаты, как Prolog?
Dmitry
а пролог делает откаты? надо его внедрить в госсектор
kosc
Подскажите, пожалуйста, правильно ли я понимаю работу с SQLite в Haskell при помощи sqlite-simple (https://github.com/nurpax/sqlite-simple). Создаём АДТ (data), который будет отображать одну запись в отдельно взятой таблице нашей БД. Создаём инстанс тайпкласса FromRow для этого АДТ, в котором реализуем функцию для преобразования SQL-записи в этот АДТ. Можете, пожалуйста, исправить и/или дополнить то, что я сказал?
Alexander
народ, haskell же не делает откаты, как Prolog?
нет, паттерн матчинг строго линейный
Sergey
нет, паттерн матчинг строго линейный
то есть, первый, который подошел, тот и отработает, да?
kosc
Да
Sergey
супер) спасибо)