Влод
они могут принадлежать
Влод
всё равно не сработает
Artyom
это известная задача вроде бы в упрощённом варианте, “какой тип у функции \f -> (f True, f "foo") ”
Artyom
только вот решения я не помню :( или вообще никак не решается, или через какую-то жуть
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
попробуй в сорте укажи или сюда орд добавь сначала
а если тебе неизвестен контстрейнт?
кана
типа такого нельзя сделать? mapBoth :: (cnt b, cnt c) => Proxy cnt -> (cnt a => [a] -> [a]) -> [b] -> [c] -> ([b], [c]) mapBoth Proxy f [] [] = ([], []) mapBoth Proxy f xs ys = (f xs, f ys)
кана
это не работает, конечно
Alexander
f :: forall x . x -> () например
Alexander
тогда функия \f -> (f True, f "foo") будет :: (forall x. x -> ()) -> ((),())
Alexander
можно сделать более внятную
Alexander
можно
Artyom
@qnikst не, ну разумеется, но надо не “любой тип”, а “наиболее общий”
кана
ну, контрейт - это обычный тип, а тип через проки можно передать
Alexander
что значит наиболее общий для Haskell?
Alexander
у нас subtyping не завезли
Кабачок
Вот так работает sort: mapBoth :: (Ord b, Ord c) => (forall a. Ord a => [a] -> [a]) -> [b] -> [c] -> ([b], [c])
Alexander
я начала дискуссии не видел если что
Artyom
я вот как раз только собирался добавить сноску “for some reasonable definition of ‘наиболее общий’” :troll:
Alexander
=)
Artyom
я думаю, в этом случае пойдёт любой тип, который позволит передавать функции вида f :: forall a. (c1 a, c2 a, ...) => a -> B, где String и Bool удовлетворяют всем констрейнтам c1, c2, ...
Влод
погуглил прокси и там как обычно
кана
кстати, вполне работает, лол отдает ([2,3],[True,True])
кана
Влод
ну разве что сразу в сигнутуре mapBoth
Влод
Не подходит такой вариант к сожалению
Влод
Вот так работает sort: mapBoth :: (Ord b, Ord c) => (forall a. Ord a => [a] -> [a]) -> [b] -> [c] -> ([b], [c])
Кабачок
А без первого кейса с пустыми списками будет работать?
кана
ой, там случайно
кана
первый кейс не нужен, я просто сначала не так сигнатуру понял и начал писать рекурсивно, а потом увидел, что функция со списком работает
Кабачок
(Используемые расширения RankNTypes и ConstraintKinds, если ghci правильно подсказывает.)
Влод
https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Proxy.html
кана
да, они самые
Влод
https://hackage.haskell.org/package/tagged-0.7.2/docs/Data-Proxy.html
Влод
кстати интересно было бы посмотреть на hackage с позиции иерархии модулей
кана
это просто единичный тип с фантомным параметром, который можно использовать для передачи типа
Влод
да
Влод
к сожелению это сложно написать в модуле лучше написать рекурсивное определение, мол здесь в модуле описан прокси тип, про который вы несомненно слышали, иначе зачем сюда вообще смотрите
Vitaliy
У меня не компилируется
Vitaliy
И оно должно работать так: ghci> mapBoth (nub . sort) [10, 2, 1, 2] [True, False, True] ([1, 2, 10], [False, True]) ghci> mapBoth ((:[]) . product . nub) [10, 2, 1, 2] [5.3, 4.2] ([ 20 ], [ 22.26 ])
Vitaliy
Без явной передачи типа
кана
то есть вариант с прокси пролетает?
Alexander
без прокси не взлетит
Alexander
он не выведет нужный констрейнт сам
Влод
интересно откуда берётся это "должно"? есть задание в котором сказано что задача выполнима?
Alexander
ну с лисперами поспорил наверное
Alexander
второй пример это вообще не map между прочим..
Alexander
так.. нас запутали словом map
Alexander
меня во всяком случае
Влод
ещё эту штуку толком мапом не назовёшь: не меняет тип и меняет структуру.
Alexander
applyToBoth
Влод
аа ну я пропустил сообщения
Vitaliy
Либо препод нас троллит
кана
в задании была только сигнатура или сигнатуру ты уже сам написал?
Arseniy
Ваш препод тут сидит
Vitaliy
Задание позиционируется как бонусное и экстра сложное
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
лол
Влод
скинь задание
Vitaliy
Ваш препод тут сидит
Добрый вечер. Хорошо что я шифруюсь
Vitaliy
Vitaliy
Мне кажется надо что-то размутить с TypeApplications
кана
@jagajaga "примерно следующим" это "именно так, как в примере" или допускается использование прокси, как у меня? Видно, что вывод в ghci фейковый (прити-принт), отсюда и вопрос
Vitaliy
Мне кажется если бы подразумевалось явное указание типов в каком-то виде это было бы указано
кана
ну так TypeApplication - тоже явное указание типов
кана
Dmitrii
Примерно — это примерно. Именно так как в примере — это именно так как в примере. Мне не нравится идея получать баллы за задания засчёт сообщества. Задание сделано для того, чтобы поразбираться в сложных темах самостоятельно и проверить свои силы. Думаю, весь курс будет очень благодарен блинчикам Морозко за то, что студенты больше не смогут получить баллы за это задание :)
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
грустно как-то получилось :с
кана
А можно, кстати, как-то получить список всех заданий?
Влод
есть подозрение что составлял задания тоже студент. из-за этого "примерно" и "map"
Dmitrii
@kana_sama Решение на последнем скриншоте правильное. Отдельный challenge -- подумать, как передавать констрейнты вида (Ord a, Num a).
Vitaliy
ну так TypeApplication - тоже явное указание типов
Я имел в виду используя эту штуку сделать так чтобы работало как в примерах
Dmitrii
Добрый вечер. Хорошо что я шифруюсь
Кстати, это тебе не помогло, тебя уже деанонимизировали ;)
Alexander
если бы там было apply было бы приятнее конечно, а не map
Alexander
блин отвлечешься на работу, и все инетересное пропустил