Что означает:: (двойная двоеточие) в Haskell?

Я вижу и использую символы :: всюду, но до сих пор не знаю, что означает символ :: при программировании в Haskell, например

run :: Int -> Int -> Int
--  ??

Что означает :: (double colon) в Haskell?

Ответ 1

Вы можете google для haskell "double colon" или подобных вещей; это, к сожалению, немного сложно для Google для синтаксиса, но в этом случае вы можете назвать его.

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

Идея состоит в том, что вы можете вставить :: ... в любом месте (даже в середине выражения), чтобы сказать "кстати, г-н Компилятор, это выражение должно иметь тип ...". Затем компилятор выдаст ошибку, если это может быть доказано, что это может быть не так.

Я думаю, вы также можете использовать его для "броска" функций в нужные вам версии; например если функция является "полиморфной" (имеет общую подпись типа), и вы действительно хотите, скажем, Integer, тогда вы могли бы сделать :: Integer по результирующему значению; Я немного ржавый, хотя.

Ответ 2

Вы должны прочитать:

foo :: a 

as "имя foo - это значение типа a". Когда вы пишете:

run :: a -> b 

это означает:

  • Вы объявляете имя run.

  • Это имя будет ссылаться на значение, имеющее тип a -> b,

Тип a -> b - это тип функции, которая принимает значение типа a и возвращает другое значение типа b.

Вы должны действительно узнать о типах, чтобы понять Haskell. Система типов является одной из наиболее важных особенностей Haskell, и это делает язык настолько выразительным.

Ответ 3

Если у вас есть большая страшная ошибка проверки типа, вы можете (временно) обернуть части своего кода в (myexpression :: MyType), чтобы явно указать компилятору, тип которого вы ожидаете myexpression. Это часто поможет компилятору дать вам лучшие сообщения об ошибках.