2010-06-27 8 views
36

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

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

+0

Возможный дубликат [Можно определить новые ADT в GHCi] (http://stackoverflow.com/questions/3849716/is-it-possible-to-define-new-adts-in-ghci) – newacct

+4

@ newacct: Я задал этот вопрос до того, как был задан вопрос, на который вы ссылались. – titaniumdecoy

+1

Как говорит Алексей Романов, вы можете в ghc 7.4.1 и выше. – Davorak

ответ

28

titaniumdecoy, я помню, помог с этим видом GHCi тайны, когда я узнал, часто сделал дело, что писать такие вещи, как «пусть квадрат х = х * х» внутри 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) 

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

12

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

13

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

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