当我尝试定义新类型时,我在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 :(得分:28)
titaniumdecoy
,我记得当我从GHCi中写出像'let square x = x * x'这样的东西时,经常会有这样的GHCi神秘感,就像写let a = f b
一样在do
monad中使用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)
没有人会在这样的序列中间声明数据类型,但会在模块的其他地方执行。我可能已经猜到存在某种理论上的反对意见,但Don S.的评论表明没有一个。
答案 1 :(得分:22)
答案 2 :(得分:13)
仅供历史参考,HBI Haskell interactive environment允许在命令行使用完整的Haskell,包括类型,类等。没有先验 GHCi无法以类似的方式运作,用户可以编写支持此功能的GHC-API的前端......
答案 3 :(得分:12)
ghci不允许您从交互式输入中定义类型 - 而是需要将您的类型定义放在一个文件中,并将:load
文件放入ghci。