如何解决haskell中的基本编译错误

jvidinwx  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

大家好,我刚开始学习Haskell,我要编译的每一段代码都会给我同样的错误:

<interactive>:1:1: error:
    • Variable not in scope: main
    • Perhaps you meant ‘min’ (imported from Prelude)

字符串
只是期望学习如何在haskell中编译

bxjv4tth

bxjv4tth1#

尝试创建一个名为Exemplo.hs的Haskell源文件。名称的拼写应该完全相同,以“E”开头。文件的第一行应该是一个module语句,该语句使用与源文件名称相同的模块名称:

module Exemplo where  -- "Exemplo" here should match filename "Exemplo.hs"

soma :: [Int] -> Int
soma [] = 0
soma (h:t) = h + soma t

字符串
现在,在交互式GHC提示符(通过运行ghci获得)中,您可以加载此文件(使用:load Exemplo)并测试您的函数。使用命令行,它看起来像这样:

~/src/overflow$ ghci
GHCi, version 9.4.7: https://www.haskell.org/ghc/  :? for help
ghci> :load Exemplo
[1 of 1] Compiling Exemplo          ( Exemplo.hs, interpreted )
Ok, one module loaded.
ghci> soma [1,2,3,4,5]
15
ghci>


如果你想创建一个编译后的可执行文件,你必须创建一个定义了main函数的源文件,这个函数将决定程序的功能。你可以给源文件起任何你喜欢的名字,但是你应该NOT包括一个module语句。例如,创建一个包含以下行的文件Programa.hs

soma :: [Int] -> Int
soma [] = 0
soma (h:t) = h + soma t

main :: IO ()
main = do
  putStrLn "Enter a list of numbers in Haskell syntax (e.g., [1,2,3,4,5]):"
  numbers <- readLn
  putStrLn "The sum is:"
  print (some numbers)


现在,你可以用ghc编译这个程序,并运行得到的可执行文件。它看起来像这样:

~/src/overflow$ ghc Programa
[1 of 2] Compiling Main             ( Programa.hs, Programa.o )
[2 of 2] Linking Programa
~/src/overflow$ ./Programa
Enter a list of numbers in Haskell syntax (e.g., [1,2,3,4,5]):
[1,2,3,4,5]   <--- I entered this part
The sum is:
15
~/src/overflow$


GHC使用模块系统,其中每个文件都是一个模块。文件可以以命名模块的module XXX where语句开头,也可以省略module语句,在这种情况下假定为Main模块。当一个模块使用import语句导入另一个模块时:

import SomeModule


编译器将尝试在文件SomeModule.hs中查找模块,因此module SomeModule where语句中的模块名称与文件名中的模块名称匹配非常重要。模块名称必须以小写字母开头,因此这意味着应该是模块的Haskell源文件也应该以小写字母开头命名。在Exemplo.hs中创建模块将有效,但exemplo.hs可能不会。
Main模块比较特殊,当你编译一个文件时,(或使用GHCi加载文件),第一行包含module Main where语句或根本不包含module语句(因此默认为Main模块),编译器希望它是一个独立的程序而不是一个常规模块,它会寻找一个main函数。使用旧版本的GHC,你会得到一个神秘的错误消息,也许你指的是min。较新版本的GHC给予一个稍微好一点的错误消息:

Main.hs:1:1: error:
    The IO action ‘main’ is not defined in module ‘Main’


所以,这意味着:
1.如果你想创建一个Haskell源文件,它不是一个独立的程序,而是包含你想与GHCi交互测试的函数,或者编译成一个可以被其他模块import艾德编译的模块,那么你应该给它命名,而不是Main.hs,你应该确保文件名的第一个字母是Main.hs,你应该在顶部包含一个与文件名MyModule.hs匹配的模块module MyModule where语句。
1.如果你想创建一个独立的Haskell源文件,你可以给它起任何名字,带或不带一个小写字母。你应该省略module语句,你必须定义一个main函数来定义独立程序在运行时的实际操作。

相关问题