Почему я не могу определить новый тип в ghci?

Я получаю ошибку в ghci, когда я пытаюсь определить новый тип:

Prelude> data Point = Pt Int Int
<interactive>:1:0: parse error on input `data'
Prelude> let data Point = Pt Int Int
<interactive>:1:4: parse error on input `data'

Что я делаю неправильно?

36
задан titaniumdecoy 27 June 2010 в 06:34
поделиться

3 ответа

titaniumdecoy, я помню, как мне помогли разобраться с подобной загадкой GHCi, когда я узнал часто повторяемое замечание о том, что писать такие вещи, как "let square x = x * x" внутри GHCi все равно, что писать let a = f b с do нотацией в IO монаде - скажем, в таком примере:

palindromize :: IO ()
palindromize = do
  a <- readFile "foo.txt"
  let b = reverse a
  putStrLn (a ++ b)

Аналогично, когда вы переопределяете выражение в GHCi, это как бы делает следующее в do нотации, что совершенно законно:

makeMess :: IO ()
makeMess = do
   a <- readFile "foo.txt"
   let b = reverse a
   putStrLn (a ++ b)
   let b = a
   putStrLn (a ++ b)

Никто не стал бы объявлять тип данных в середине такой последовательности, а сделал бы это в другом месте модуля. Я мог бы предположить, что существует какое-то теоретическое возражение, но замечание Дона С. говорит о том, что его нет.

28
ответ дан 27 November 2019 в 05:41
поделиться

ghci не позволяет вам определять типы из интерактивного ввода - вместо этого вам нужно поместить определение типа в файл и : загрузить файл в ghci.

12
ответ дан 27 November 2019 в 05:41
поделиться

Просто для исторической справки: интерактивная среда HBI Haskell позволяет использовать полный Haskell из командной строки, включая типы, классы и так далее. Нет априори GHCi не может работать аналогичным образом, и пользователи могут написать интерфейс для GHC-API, который поддерживает это ...

13
ответ дан 27 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

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