当我尝试定义一个新的类型时,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'
我做错了什么?
当我尝试定义一个新的类型时,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
,我还记得当我学到写诸如 '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的评论表明并没有。
在ghci中,你无法从交互式输入中定义类型 - 相反,你需要将你的类型定义放在一个文件中,并使用:load
命令将该文件加载到ghci中。
仅供历史参考,HBI Haskell交互环境可在命令行中完全使用Haskell,包括类型、类等。 GHCi a priori 不能类似地操作,用户可以编写一个支持此功能的GHC-API前端...