2016-02-29 2 views
0

Я пытался определить значение с определенным типом типа «Int», но кажется, что Prelude не поддерживает его?Как определить значение с типом в выражении «let» Haskell?

Prelude> let c::Int = 4 
Prelude| 

<interactive>:49:8: 
    Illegal type signature: ‘Int’ 
     Perhaps you intended to use ScopedTypeVariables 
    In a pattern type-signature 
Prelude> let [Int]c=4 
Prelude| 

<interactive>:51:5: Parse error in pattern: [Int] 

Как исправить ошибку?

+2

Подписи типов могут появляться в отдельной строке (в объявлениях let, where или верхнего уровня) или в выражениях. Типовые подписи не для левой стороны привязки. –

+0

Возможный дубликат [Многострочные команды в GHCi] (http://stackoverflow.com/questions/8443035/multi-line-commands-in-ghci) –

+2

«Как исправить?» - ошибка говорит, как - «Возможно, вы намеревались использовать ScopedTypeVariables». Включить ScopedTypeVariables в ghci с помощью:: set -XScopedTypeVariables'. То есть, если вы хотите использовать этот конкретный синтаксис. – user2407038

ответ

4

В файле Haskell, объявление типа предоставляется отдельно от определений, как правило, на линии перед:

c :: Int -- Type declaration 
c = 4  -- Definition 

Это справедливо для локальных определений, а также как глобальные; вам просто нужно убедиться, что отступы выровнены. Так что в этом случае мы имеем

let c :: Int 
    c = 4 
in c + c 

В Haskell, новые строки и отступы могут быть заменены скобки и двоеточия, а иногда и фигурные скобки могут быть опущены. В GHCi, где для ввода нескольких строк требуется some extra machinery, вам обычно нужен вариант с разделителями с запятой; а именно, что будет

let c :: Int ; c = 4 

(Отсутствие in потому, что GHCi ведет себя немного как do блока;. this Stack Overflow question имеет больше информации)

Однако, это выглядит с вашей подсказки, как вы есть :set +m включен, так что вы можете использовать опцию многострочный тоже:

Prelude> let c :: Int 
Prelude|  c = 4 
Prelude| 
Prelude> 

(Кроме того, если вы хотите добавить аннотацию типа позже, let c = 4 ; c :: Int работает отлично, это просто не лучший стиль для файла, который вы 'р е работает над)


Кроме того, важное замечание:. Вы не используете «Прелюдия», вы используете GHCi, интерактивная среда Haskell GHC,. Prelude - это модуль, который по умолчанию импортируется во все программы Haskell (он содержит определения Bool, Eq, (.) и т. Д.). В приглашении GHCi по умолчанию содержится список всех импортированных модулей, поэтому по умолчанию это Prelude>; однако, если вы наберете import Data.Function, подсказка изменится на Prelude Data.Function>.

 Смежные вопросы

  • Нет связанных вопросов^_^