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

39

当我尝试定义一个新的类型时,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'

我做错了什么?


6
@newacct:在你链接的问题被提出之前,我已经问过这个问题了。 - titaniumdecoy
1
正如Alexey Romanov所说,您可以在ghc 7.4.1及更高版本中实现。 - Davorak
4个回答

28

titaniumdecoy,我还记得当我学到写诸如 'let square x = x * x' 这样的代码时在 GHCi 中遇到的谜团,就像在 IO monad 中用 do 符号写出 let a = f b 一样 - 就像这个例子:

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)

在这样的一系列操作中,没有人会在中间声明数据类型,而是会在模块的其他地方进行声明。我本来可能会猜想有某种理论上的反对意见,但唐·S的评论表明并没有。


23

13

在ghci中,你无法从交互式输入中定义类型 - 相反,你需要将你的类型定义放在一个文件中,并使用:load命令将该文件加载到ghci中。


13

仅供历史参考,HBI Haskell交互环境可在命令行中完全使用Haskell,包括类型、类等。 GHCi a priori 不能类似地操作,用户可以编写一个支持此功能的GHC-API前端...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接