Vladislav
посмотри на пример, человек понимает, что типы разные, написал их явно в h и h2
Aleksei (astynax)
Я смотрел. И не понял, чего он хочет
Vladislav
и вопрос правильный задал, отклонение ли от ФП-парадигмы делать такую перегрузку
ответ да: отклонение, потому что на Haskell это сделать очень непросто
в лучшем случае можно предложить что-то вроде h 5 @Just и h 5 @Nothing (внимание на @), но определение такой функции будет страшное
Aleksei (astynax)
странное
Maxim
Vladislav
да
Cheese
Vladislav
Это в паттернах
Vladislav
В вызовах такого нет
Anonymous
@dtulyakov будет жить. Поприветствуем!
Cheese
а, ну, человек этого не хочет на самом деле
Кабачок
А почему бы просто не объяснить новичку что у Nothing и Just разные типы?
Aleksei (astynax)
Скучно же
Vladislav
Vladislav
в h аргумент Int -> Maybe Int, в h2 аргумент Maybe Int
Vladislav
вопрос был про то, как объединить эти функции
Алексей ayaye :)
всё-таки интересно, зачем. ведь конструктор либо явно при вызове h задается и тогда можно его и использовать. либо приходит как параметр, но почему там же и значение типа Maybe Int не построить?
Alexander
Alexander
в любом случае если обощить тип так чтобы и Maybe a и a->Maybe a подходило, то проматчить по реализации функции (Just) мы не сможем
Alexander
кот в wai хорошо разбирается?
Alexander
у меня неочевидный вопрос есть
Влад
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
Ilya
правда у меня не получилось избежать лишних аннотаций типов, применение выходит довольно громоздким
Aleksei (astynax)
Тайпкласс то получится уж больно похожий на Functor
Alexander
не не, он хочет чтобы и (a -> f a) и f a можно было матчить одновременно, если предположить что запись корректна
Alexander
а так да - просто функтор
Ilya
Alexander
Ilya
h должна работать "со штуками кайндом * -> *" а значить матчить там нечего
Алексей ayaye :)
по аналогии с ооп это какая-то виртуализация конструктора, которая не нужна, потому что в момент вызова конкретный конструктор известен.
Ilya
Ilya
Alexander
Alexander
имхо
Ilya
окей, может быть
Alexander
вот как эта функция будет работать с (->) а?
Alexander
или Const b a
Ilya
Ilya
(если через классы делать)
Alexander
или T a = N l U a l Q a l P a a
Ilya
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
что значит нельзя считать?