模块“Main”未导出IO操作“main”。

6

我有两个Haskell文件,一个是SimpleJSON.hs,另一个是Main.hs。

--File: SimpleJSON.hs
module SimpleJSON
(
    JValue (..)
    ,getString
    ,getInt
    ,getDouble
    ,getBool
    ,getObject
    ,getArray
    ,isNull
) where

data JValue = JString String
        | JNumber Double
        | JBool Bool
        | JNull
        | JObject [(String, JValue)]
        | JArray [JValue]
          deriving (Eq, Ord, Show)

And

--File: Main.hs
module Main () where
import SimpleJSON
main = print (JObject [("foo", JNumber 1), ("bar", JBool False)])

因此,在编译时我会执行以下操作:

ghc -c SimpleJSON.hs

并且

ghc simple Main.hs SimpleJSON.o

然后我遇到了错误,错误信息如下:
Main.hs:1:1: error:
The IO action ‘main’ is not exported by module ‘Main’
  |
1 | module Main () where
  | ^

如何解决这个编译错误?

我是一个真正的新手。我正在做《Real World Haskell》中的同一个例子,遇到了同样的问题。只是想在这里提一下这本书。我在2023年购买了这本书,很失望它没有进行修订以跟上时代的步伐,但它仍然似乎是最好的选择。 - Jonathan Komar
2个回答

13

应该是这样的

module Main where
或者
module Main (main) where

谢谢。它完美地运行了。你能详细解释一下吗?因为我对此还是个新手。 - Saurabh kukade
1
通过使用 (),您可以限制从模块导出哪些函数。例如,请参见http://learnyouahaskell.com/modules#making-our-own-modules。 - mb21
1
概述:module Name 导出所有内容,module Name () 仅导出类型类实例,而 module Name (…) 仅导出列在 中命名的实体。 我倾向于使用 module Main (main) ,因为这样我可以通过 -Wall(或 -fwarn-unused-binds)获得有关模块中任何未使用定义的警告。 - Jon Purdy

7
这篇文章是专门为Real World Haskell读者准备的。似乎该书使用的是Haskell的旧版本,在其中不需要在导出列表中明确提到main。但在最新版本中,情况已经不同了。
需要提及两个方面:
  • 您需要编写module Main (main) where以导出main
  • 您不需要制作SimpleJSON.hs的对象文件,并在编译Main.hs时提到它,即仅运行ghc -o simple Main.hs就足够了
作为一般说明,该书的亚马逊页面上的一些评论提到了书中涵盖的某些方面已经过时。因此,如果您正在跟随本书,请务必使用其他来源来了解差异。

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