为什么我不能在ghci中定义新类型?

tit*_*coy 36 haskell 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'

我究竟做错了什么?

app*_*ive 28

titaniumdecoy我记得当我学到了经常提出的观点,即在GHCi中写"let square x = x*x"之类的东西就像在monad let a = f b中用do符号写作一样,我记得在这种GHCi神秘的帮助下IO- 比如说这种例子:

palindromize :: IO ()
palindromize = do
  a <- readFile "foo.txt"
  let b = reverse a
  putStrLn (a ++ b)
Run Code Online (Sandbox Code Playgroud)

类似地,当您在GHCi中重新定义表达式时,它有点像在do符号中执行以下操作,这是完全合法的:

makeMess :: IO ()
makeMess = do
   a <- readFile "foo.txt"
   let b = reverse a
   putStrLn (a ++ b)
   let b = a
   putStrLn (a ++ b)
Run Code Online (Sandbox Code Playgroud)

没有人会在这样的序列中间声明数据类型,但会在模块的其他地方执行.我可能已经猜到存在某种理论上的反对意见,但Don S.的评论表明没有一个.


Don*_*art 13

仅供历史参考,HBI Haskell交互式环境允许在命令行中使用完整的Haskell,包括类型,类等.没有先验的 GHCi无法以类似的方式运行,用户可以编写一个前端支持GHC-API ...


Amb*_*ber 12

ghci不允许您从交互式输入中定义类型 - 相反,您需要将类型定义放在文件中,:load将文件放入ghci中.