Vladislav
посмотри на пример, человек понимает, что типы разные, написал их явно в h и h2
Aleksei (astynax)
Я смотрел. И не понял, чего он хочет
Vladislav
и вопрос правильный задал, отклонение ли от ФП-парадигмы делать такую перегрузку ответ да: отклонение, потому что на Haskell это сделать очень непросто в лучшем случае можно предложить что-то вроде h 5 @Just и h 5 @Nothing (внимание на @), но определение такой функции будет страшное
Vladislav
Я смотрел. И не понял, чего он хочет
Насколько я вижу тут хочется абстракцию не по значением типа, а по конструкторам типа
Aleksei (astynax)
странное
Vladislav
да
Vladislav
Это в паттернах
Vladislav
В вызовах такого нет
Anonymous
@dtulyakov будет жить. Поприветствуем!
Cheese
а, ну, человек этого не хочет на самом деле
Кабачок
А почему бы просто не объяснить новичку что у Nothing и Just разные типы?
Aleksei (astynax)
Скучно же
Vladislav
в h аргумент Int -> Maybe Int, в h2 аргумент Maybe Int
Vladislav
вопрос был про то, как объединить эти функции
Алексей ayaye :)
всё-таки интересно, зачем. ведь конструктор либо явно при вызове h задается и тогда можно его и использовать. либо приходит как параметр, но почему там же и значение типа Maybe Int не построить?
Alexander
@qnikst в случае с <$ надо будет 5 <$ Just (), а не 5 <$ Just, это не то же самое
у Just тип не Maybe Int, так что не подходит там опечатка и имелось ввиду Just{}
Alexander
в любом случае если обощить тип так чтобы и Maybe a и a->Maybe a подходило, то проматчить по реализации функции (Just) мы не сможем
Alexander
кот в wai хорошо разбирается?
Alexander
у меня неочевидный вопрос есть
Влад
всё-таки интересно, зачем. ведь конструктор либо явно при вызове h задается и тогда можно его и использовать. либо приходит как параметр, но почему там же и значение типа Maybe Int не построить?
Дальше я хотел узнать как сделать так чтобы моя функция h могла так делать не только с Maybe но и с другими штуками с кайндом * -> * ... Или типа того, хз. Может по другому признаку типа data Maybe a = Just a | Nothing - из Прелюда data SomeThingElse a = Some a | Thing и чтоб: h 5 Just == Just 5 h 7 Nithing == Nothing и одновременно h 6 Some == Some 6 h 8 Thing == Thing {Если что я новичёк, я не знаю зачем я это буду применять в практических целях, мне просто интересно можно ли так на Haskell или почему так нельзя и что для этого нужно сдлеать с языком. Повторю что мне просто захотелось и мне интересно}
Alexander
а с (->) a она что делать будет?
Alexander
кайнд подходит
Alexander
но я повторюсь, x <$ m, делает максимально похожее
Alexander
оно же fmap (const x) m
Alexander
для любого функтора все значения внутри будут заменены на твое если их можно заменить
Alexander
соответственно для SomeThing тоже будет работать если ты derive Functor сделаешь
Alexander
что не включал?
Влад
derive Functor
Alexander
можешь руками инстанс написать.. просто так печатать меньше
Влад
ну да, под включить я имел ввиду дописать derive Functor, но даже на это мне не хватило времени проверить, так как я уже собирался уходить
Alexander
в общем по непримененному к аргументам конструктору матчить не получится, т.к это функция
Alexander
по Just{} конструктор и не важно какие аргументы - можно, и так заработает
Alexander
сделать код, который будет работать с разными типами данных - нужна дополнительная информация о том, как это должно происходить
Alexander
например математическая структура и Functor подходит
Alexander
можно использовать Generic и смотреть, что у тебя ожидаемая структура типв
Alexander
и писать generic метод (никогда таким не занимался)
Влад
Понял, спасибо большое!
Ilya
правда у меня не получилось избежать лишних аннотаций типов, применение выходит довольно громоздким
Aleksei (astynax)
Тайпкласс то получится уж больно похожий на Functor
Alexander
не не, он хочет чтобы и (a -> f a) и f a можно было матчить одновременно, если предположить что запись корректна
Alexander
а так да - просто функтор
Ilya
очень неочевидное утверждение
достаточно очевидное после вот этого поста https://t.me/haskellru/138022
Ilya
h должна работать "со штуками кайндом * -> *" а значить матчить там нечего
Алексей ayaye :)
по аналогии с ооп это какая-то виртуализация конструктора, которая не нужна, потому что в момент вызова конкретный конструктор известен.
Alexander
имхо
Ilya
окей, может быть
Alexander
вот как эта функция будет работать с (->) а?
Alexander
или Const b a
Ilya
вот как эта функция будет работать с (->) а?
смотря какой инстанс считать главнее:)
Ilya
(если через классы делать)
Alexander
или T a = N l U a l Q a l P a a
Слава
или T a = N l U a l Q a l P a a
ВсЕм ПриВетиК в ЭтОм ЧаТиКе! (выглядит ужасно)
Ilya
тут нет дилеммы
Alexander
как, что делать если там Q?
Alexander
или P?
Ilya
хз, мне интереснее что делать, если передали "Just что-то" а не "Just"
Ilya
раз можем Nothing передать, значит можем и "Just что-то"
Ilya
или P?
проверку типов завалим пускай
Кабачок
Неинтересно, если все типы, для которых определена h, будут иметь одинаковую структуру
Alexander
у меня с Compose прокатило
Alexander
https://gist.github.com/qnikst/ae9c69235e810f8f09f453c9be3f9296
Alexander
c а -> Maybe a проблема что лямбд, частичного применения нету, чтобы сделать структуру *-> *, для этого Compose
Alexander
ну я не могу сказать instance Q (\a. a -> Maybe a)
Alexander
если я напишу а то оно будет, не знаю как сказать, из глобального контекста
Ilya
ВсЕм ПриВетиК в ЭтОм ЧаТиКе! (выглядит ужасно)
Кстати есть (не)тривиальная задачка сделать лесенку из текста. Она становится нетривиальной, когда мы запрещаем себе явно пользоваться натуральным рядом, то есть "считать буквы". Кому интересно, ниже заготовка под код и тесты leaping :: String -> String leaping = undefined input1 = "всем приветик в этом чатике!" input2 = cycle "Haskell " λ> putStrLn $ leaping input1 ВсЕм пРиВеТиК В ЭтОм чАтИкЕ! λ> λ> putStrLn $ take 23 $ leaping input2 HaSkElL HaSkElL HaSkElL
Alexander
что значит нельзя считать?