【问题标题】:Haskell error - 'parse error on input `->'Haskell错误 - '输入解析错误`->'
【发布时间】:2019-11-08 10:02:11
【问题描述】:

我正在尝试将 Haskell GHCi 中的函数声明为

fact :: Int -> Int

但我收到此错误 - error: 输入时解析错误 `->'

我不明白为什么会这样。谁能给我解释一下?谢谢。

【问题讨论】:

  • 我得到“错误:变量不在范围内:fact :: Int -> Int”(AFAIK,你不能在 ghci 中“前向声明”一个类型)。您使用的是哪个版本,这就是您的全部输入吗?
  • @Megha 这适用于编译器,但对于 GHCi,语法必须略有不同。然而,这适用于 GHCi v8.2.2:let { fact :: Int -> Int ; fact 0 = 1 ; fact n = n * fact (n-1) }

标签: haskell haskell-stack haskell-platform


【解决方案1】:

首先,您似乎使用的是相当旧的 GHC 版本。在较新的版本中,GHCi 语法有所放宽。

但仍然:您在 GHCi 中键入的内容与您在 Haskell 源文件中编写的内容具有相同的规则。具体来说,GHCi prompt 本质上是一个 IO monad 链求值器,原因是你可以写类似

Prelude> putStrLn "Hello"
Hello

Prelude> readFile "test.txt" 
"fubar\nbaz"

并真正让它在那里执行。相比之下,在 Haskell 源文件中,您只需声明绑定,然后可以在 main 操作或 GHCi 会话中调用这些绑定。

但在这种情况下,您想在 GHCi 本身内声明一个绑定。你也可以这样做,但是有点尴尬,基本上你需要从let开始,然后把所有的东西都挤在一行里:

Prelude> let fact :: Int -> Int; fact n = product [1..n]

实际上,较新的 GHCi 版本允许您省略 let,并且您可以使用特殊的括号语法进行多行定义:

Prelude> :{
Prelude| fact :: Int -> Int
Prelude| fact n = product [1..n]
Prelude| :}

但我建议不要这样做。如果您实际上有一些更大的定义,最好将它们放在适当的 Haskell 源中,然后将其加载到 GHCi 中。

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2018-02-19
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多