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

时间:2010-06-27 06:34:37

标签: 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'

我做错了什么?

4 个答案:

答案 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。