Haskell: Задание ограничений одинаковой длины для списков в системе типов
В Хаскеле у меня часто есть такая функцияf
, который принимает список и возвращает список равной длины:
f :: [a] -> [a] -- length f(xs) == length xs
Точно так же я мог бы иметь такую функциюg
, который принимает два списка, которые должны быть одинаковой длины:
g :: [a] -> [a] -> ...
Еслиf
а такжеg
набираются, как указано выше, тогда могут возникать ошибки времени выполнения, если их ограничения по длине не выполняются. Поэтому я хотел бы закодировать эти ограничения в системе типов. Как я могу это сделать?
Обратите внимание, что я ищу практическую среду, которая может использоваться в повседневных ситуациях, добавляя как можно меньше интуитивных накладных расходов в код. Мне особенно интересно узнать, как вы будете иметь дело сf
а такжеg
сам; то есть, попытаетесь ли вы добавить ограничения, связанные с длиной, к их типам, как указано здесь, или оставить их с типами, указанными выше, для простоты кода?