Кабачок
Haskell без композиции — деньги на ветер
Зигохистоморфный
хотите перформанс - юзайте multiset
MS.toOccurList
. MS.filter isAlpha
. MS.fromList
$ "test as test"
Ignat
прикольн))
水
Клёвый язык. 2 часа пытаюсь Int от пользователя в ф-ю передать
Taras 🦀
😂 прям как я вхожу в регулярки
Зигохистоморфный
水
@xgrommx Там, судя по гуглу, довольно популярный запрос %) Как IO Int в Int перевести
Зигохистоморфный
Ignat
нужна какая-нибудь паста
Ignat
про «ты СОВЕРШЕННО не понимаешь сути IO»
Зигохистоморфный
Ignat
ну монадки слишком абстрактны
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
A64m
т.е. механика орфовская из пропозала вся в 8.2 есть, только инстанс для лейблов не прошел
Artem
собственно вопрос, есть ли новости, когда и в каком виде пройдёт?
A64m
но есть ли в этом смысл? сам функционал у ORF довольно убогий, не лучше ли какой-нибудь generic-lens использовать?
A64m
A64m
ну, вернее, можно предположить что работа Гендри над абстрактными линзами это часть работы по ORF
Artem
я не хотел бы обсуждать линзы: изначально ORF рекламировался, как более гибкий механизм геттеров (условно, избавление от требования уникальности имён). Разница с линзами такая, что геттеры это entry-level средство Haskell, в то время как линзы это что угодно,но не entry-level (называйте advance или ка квам нравится)
A64m
Artem
ну, это же полу решение, пользоваться ими как раньше нельзя
Artem
(Duplicate)
A64m
геттерами как функциями нельзя (без аннотации типа, там такой убогий близорукий TDNR), а в пм с вайлдкартами можно, я так их всегда восновном и использовал
A64m
а роу-полиморфизм для геттеров из ORF в 8.2 и сам по себе не энтрилевельный, там уже что с линзами что без линз. Без линз просто убого все и неудобно
Artem
да, меня интересует использование как функциями (собственно, название "геттер" это в первую очередь и подразумевает с моей точки зрения)
A64m
ну вот чтоб использовать как геттер надо сиротский инстанс в приложении объявить
Artem
роу-полиморфизм не нужно понимать новичку чтобы этим пользоваться, как не нужно понимать внутреннее устройство GHC, чтобы им что-то компилировать
Artem
да, вопрос был про то, когда это требование будет снято и какие первые шаги на когда намечены, ведь это всё было в начальном плане, как я понимаю
A64m
не нужно, но сигнатуры и типы в ошибках нужно как-то понимать (не обязательно глубоко) линзами тоже не приходя в сознание можно пользоваться с теми же оговорками
A64m
ну, может можно протащить сиротский инстанс в отдельном модуле в base, который все равно в библиотеках не используешь, также можно и подругому ORF сделать, но вроде никто не делает
A64m
ORF Гендри и так раза 4 делал прежде чем он в нынешнем виде попал в 8.2, я что-то сомневаюсь, что 5й раз будет делать
Artem
последнее что видно от него на эту тему это подпиливание DRF (октябрь 2017)
https://github.com/ghc-proposals/ghc-proposals/pull/84
A64m
A64m
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
Artem
ну вот компилируется…
A64m
наверное просто ранее скомпилированное работает или что-то вроде
Artem
да, извиняюсь, это я в GHCi пробовал с включённым флагом
Антон
Ребят, я дико извиняюсь, но что это за лейблы и как они связаны с линзами?
a66ath
Нас 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
kosc
Да
Sergey
супер) спасибо)