История изменений
Исправление Siborgium, (текущая версия) :
Да что тут не понять? HList в виде (a, (b, ())) можно интерпретировать как тупл из двух элементов.
А можно не интерпретировать.
Если программист хочет работать с туплом, но передаёт его в функцию, принимающую HList, то это - ошибка
Вы реализовали HList для тупла. Теперь передача в функцию HList’а и тупла неразличимы от друг друга.
Поэтому HList во frunk’е сделан отдельным типом
Я, для иллюстрации,
Вот с этого вам и стоило начинать. Все ваши проблемы растут именно из вашего внезапного желания написать код на туплах, хотя задекларировать cons и nil потребовало бы нескольких строчек. Мне кажется, я знаю, откуда это растет – из усердия применить знания о «высшей математике» преобразования сигнатур (a, b, c) -> d в a -> b -> c -> d. Ну да ладно, не буду гадать.
Впрочем, прав я или нет, а ровно это вам и придется делать – но ручками, чтобы вызвать заветную `foo(a, b, c) от соответствующего HList. Либо деструктурировать через макро, и руками же обратно собирать в списке аргументов.
И еще дополню.
Смотрите. Только без очередного плача «Хотю вариадики как в С++».
И я их действительно хочу. Хотя бы какие-то. Потому что пока их нет, вы так и будете писать руками деструктуринг, притворяясь, что это вариадики.
Исходная версия Siborgium, :
Да что тут не понять? HList в виде (a, (b, ())) можно интерпретировать как тупл из двух элементов.
А можно не интерпретировать.
Если программист хочет работать с туплом, но передаёт его в функцию, принимающую HList, то это - ошибка
Вы реализовали HList для тупла. Теперь функции, принимающие HList’ы и туплы неразличимы между друг другом.
Поэтому HList во frunk’е сделан отдельным типом
Я, для иллюстрации,
Вот с этого вам и стоило начинать. Все ваши проблемы растут именно из вашего внезапного желания написать код на туплах, хотя задекларировать cons и nil потребовало бы нескольких строчек. Мне кажется, я знаю, откуда это растет – из усердия применить знания о «высшей математике» преобразования сигнатур (a, b, c) -> d в a -> b -> c -> d. Ну да ладно, не буду гадать.
Впрочем, прав я или нет, а ровно это вам и придется делать – но ручками, чтобы вызвать заветную `foo(a, b, c) от соответствующего HList. Либо деструктурировать через макро, и руками же обратно собирать в списке аргументов.
И еще дополню.
Смотрите. Только без очередного плача «Хотю вариадики как в С++».
И я их действительно хочу. Хотя бы какие-то. Потому что пока их нет, вы так и будете писать руками деструктуринг, притворяясь, что это вариадики.