Когда использовать вывод типа в Haskell?

У меня была одна и та же проблема, потому что я переместил местоположение проекта и просто нуждался в воссоздании виртуального каталога.

15
задан J Cooper 21 January 2009 в 01:50
поделиться

4 ответа

Это - все еще преимущество, даже если Вы пишете подписи типа, потому что компилятор зафиксирует ошибки типа в Ваших функциях. Я обычно пишу подписи типа также, но опускаю их в местах как where или let пункты, где Вы на самом деле определяете новые символы, но не чувствуете потребность указать подпись типа.

Глупый пример со странным способом вычислить квадраты чисел:

squares :: [Int]
squares = sums 0 odds
  where
    odds = filter odd [1..]
    sums s (a:as) = s : sums (s+a) as

square :: Int -> Int
square n = squares !! n

odds и sums функции, для которых была бы нужна подпись типа, если компилятор не выведет их автоматически.

Также, если Вы используете родовые функции, как Вы обычно, делают, вывод типа - то, что гарантирует, чтобы Вы действительно объединили все те родовые функции вместе допустимым способом. Если Вы, в вышеупомянутом примере, говорите

squares :: [a]
squares = ...

, компилятор может вывести, что это не допустимо этот путь, потому что одна из используемых функций (эти odd функция из стандартной библиотеки), потребности a, чтобы быть в классе Integral типа. На других языках Вы обычно только распознаете это позже.

, Если Вы пишете это как шаблон в C++, Вы получаете ошибку компилятора при использовании функции на нецелочисленном типе, но не при определении шаблона. Это может довольно сбивать с толку, потому что это не сразу понятно, где Вы пошли не так, как надо, и Вам, возможно, придется просмотреть длинную цепочку сообщений об ошибках для нахождения реального источника проблемы. И в чем-то как Python Вы получаете ошибку во времени выполнения в некоторой неожиданной точке, потому что что-то не имело ожидаемых функций членства. И на еще более свободно типизированных языках Вы не могли бы получить ошибку, но просто неожиданные результаты.

В Haskell компилятор может гарантировать, что функция может быть вызвана со всеми типами, указанными в, он - подпись, даже если это - родовая функция, которая допустима для всех типов, которые выполняют, некоторые ограничивают (иначе вводят классы). Это помогает программировать универсальным способом и пользоваться универсальными библиотеками, что-то намного тяжелее для разбираний на других языках. Даже при определении универсальной подписи типа существует все еще большой вывод типа, продолжающий в компиляторе узнать, какой определенный тип используется в каждом вызове и если этот тип выполняет все требования функции.

16
ответ дан 1 December 2019 в 02:47
поделиться

У Вас есть хорошие инстинкты. Поскольку они проверяются компилятором, подписи типа для значений верхнего уровня предоставляют неоценимую документацию.

Как другие, я почти всегда помещал подпись типа для функции верхнего уровня, и почти никогда для любого другого объявления.

другой вывод типа места неоценим, в интерактивном цикле (например, с GHCi). Эта техника является самой полезной, когда я разрабатываю и отлаживаю некоторую необычную новую функцию высшего порядка или некоторых такой.

4
ответ дан 1 December 2019 в 02:47
поделиться

Я всегда пишу подпись типа для функций верхнего уровня и значений, но не для материала в том, "где", "позвольте" или сделайте пункты.

Первые высокоуровневые функции обычно экспортируются, и Пикше нужно описание типа для генерации документации.

112-секундный, когда Вы делаете ошибку, ошибки компилятора намного легче декодировать, если компилятор имеет информацию о типе в наличии. На самом деле иногда в сложном, "где" пункт я получаю непостижимую ошибку типа, таким образом, я добавляю временные описания типа для нахождения проблемы, немного как уровень типа эквивалентной из отладки printf.

Так для ответа на исходный вопрос я использую вывод типа много, но не 100% времени.

5
ответ дан 1 December 2019 в 02:47
поделиться

Когда вы сталкиваетесь с ошибкой проверки типа, хотя компилятор Haskell и предоставляет информацию об ошибке, эту информацию может быть трудно расшифровать. Для удобства можно прокомментировать сигнатуру типа функции, а затем посмотреть, что компилятор сделал с типом и чем он отличается от предполагаемого типа.

Другое применение - это когда вы строите "внутреннюю функцию" внутри функции верхнего уровня, но не знаете, как построить внутреннюю функцию или даже каким должен быть ее тип. Что вы можете сделать, так это передать внутреннюю функцию в качестве аргумента в функцию верхнего уровня, а затем спросить ghci о типе функции уровня типа. Это будет включать тип внутренней функции. Затем вы можете использовать инструмент типа Hoogle, чтобы проверить, существует ли эта функция уже в библиотеке.

.
1
ответ дан 1 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: