А типизация в Хаскеле очень строгая

Jul 13, 2020 22:43

Как в Аде, практически. Даже константы автоматически не приводятся к типу, который объявлен для поля в записи. Это касается объектов-классов типов для разбора командной строки из библиотеки cmdargs. Например, FilePath это просто алиас String. Но, поскольку он объявлен как отдельный тип в виде data FilePath=String, то это уже другой тип и его явно надо приводить. Но с константами вышло по другому. Я взял для основы примеры кода и там аннотационное поле в объявлении объекта, которое генерируется функцией opt и задает значение по умолчанию в случае, когда параметр командной строки есть, а значения нет, т.е. если есть например --param=INT, то для него недостаточно написать opt 100, а нужно opt (100::Int) - так же и со строками: не просто opt "value", но opt ("value"::String), тогда компилятор не ругается. В этом случае пишется --param или -p без всего. Почему-то в новых версиях компилятор уже не может однозначно выводить типы. Подозреваю впрочем, что в данном контексте из этих констант можно вывести неоднозначно несколько строго разных типов, хотя по сути эти типы эквивалентны. Правда со строками есть нюанс: тип Text представляет юникодную строку, а тип String (который на самом деле алиас [Char]) - обычную строку ASCII. И из строковой константа, хотя бы и содержащая только ascii может быть выведен как Text, так и String.

программаж

Previous post Next post
Up