Почему я не могу определить новый тип в 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'

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

Ответ 1

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)

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

Ответ 3

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

Ответ 4

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