Почему я не могу определить новый тип в ghci? - PullRequest
36 голосов
/ 27 июня 2010

Я получаю сообщение об ошибке в 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'

Что я делаю не так?

Ответы [ 4 ]

28 голосов
/ 28 июня 2010

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)

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

22 голосов
/ 07 ноября 2012

Возможно , так как GHC 7.4.1 .

13 голосов
/ 27 июня 2010

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

12 голосов
/ 27 июня 2010

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

...