Haskell入门编译错误

5

我刚刚安装了Haskell平台,使用的是这个链接中提供的安装程序:https://www.haskell.org/platform/mac.html

作为一个新手,我创建了一个非常简单的程序,只是为了测试它是否能正常工作:

f :: Int -> Int
f x = x + 2

当我执行时
runhaskell test.hs

它返回

test.hs:0:53: 错误:

• 变量不在作用域中:main :: IO a0

• 或许你想使用 ‘min’(从Prelude导入)

如果我运行

ghc test.hs

它返回

在模块'Main'中未定义IO操作'main'

仅指示第一行的第一个字符"f"


5
Haskell期望您的程序有一个入口点,即main函数。如果您想加载交互式REPL,请尝试使用ghci test.hs - Alec
1
非常感谢,这正是我在寻找的。 - exrezzo
自从安装 Haskell 成功后,推荐的下一步是学习一些 Haskell。这里有一个很好的教程可供参考:http://learnyouahaskell.com/chapters。 - mschmidt
1个回答

9

使用您的程序,您没有告诉Haskell程序应该做什么。您只是定义了一个函数。这并不意味着Haskell会自动调用该函数。

您需要定义一个特殊名称为main的函数(ghc有一个选项可以指定另一个名称,但现在让我们忽略它)。main是类型为IO a的函数。它是一种描述在执行程序时调用的操作(IO)的函数。

由于您只定义了一个单独的函数f,您可能想要测试f

因此,我们可以编写一个main

main :: IO ()
main = print (f 2)

现在,如果将此内容添加到程序中。编译器将生成一个可执行文件来执行main。这里的main非常简单:我们指示它print f 2的结果。因此,它将打印4。我们称main为程序的入口点
您还可以决定运行一个交互式会话。在这种情况下,您不需要入口点,因为您可以在交互式会话中决定调用哪些函数。
例如,您可以使用ghci file.hs启动一个交互式会话,并运行:
$ ghci testprogram.hs 
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( testprogram.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 2
4

现在,我们调用了f 2,交互式会话自动打印结果4


非常好!这正是我在寻找的,因为在大学里我曾经在一个 .hs 文件中编写了一个简单的函数,然后点击它后打开了一个交互式 shell(我们使用 Windows 机器)。所以这就是我一直在寻找的,那个命令就是 ghci。非常感谢! - exrezzo
1
我更喜欢使用print(f 2),因为它避免了引发$符号意义的问题。此外,我认为说main是一个单子函数没有太多用处:对于初学者来说,“单子”这个词很容易让人困惑,而对于专家来说,“函数”这个词则不太准确。我宁愿说“main是执行IO操作的动作...”,甚至比这更简单的说法是“main是程序的入口点”。 - amalloy

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