Я получаю ошибку в 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'
Что я делаю неправильно?
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)
Никто не стал бы объявлять тип данных в середине такой последовательности, а сделал бы это в другом месте модуля. Я мог бы предположить, что существует какое-то теоретическое возражение, но замечание Дона С. говорит о том, что его нет.
ghci не позволяет вам определять типы из интерактивного ввода - вместо этого вам нужно поместить определение типа в файл и : загрузить
файл в ghci.
Просто для исторической справки: интерактивная среда HBI Haskell позволяет использовать полный Haskell из командной строки, включая типы, классы и так далее. Нет априори GHCi не может работать аналогичным образом, и пользователи могут написать интерфейс для GHC-API, который поддерживает это ...