You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell编译报错:Parse error: 期望模块头或顶层声明

Why fst (1,2) Works in GHCi But Fails to Compile

Hey there! I totally get why this confusion happens—GHCi and compiled Haskell files have different rules for what counts as valid code. Let’s break down the problem and fix it step by step.

The Root Cause

GHCi is an interactive REPL (read-eval-print loop). When you type fst (1,2) there, it automatically evaluates the expression and prints the result for you.

But compiled Haskell .hs files follow strict module structure rules. The top level of a file can only contain:

  • A module header (like module Main where),
  • Import statements,
  • Top-level function/type declarations,
  • Or a main function (the entry point for executable programs).

Directly writing an expression like fst (1,2) at the top level makes the compiler confused—it’s not a declaration, just a value waiting to be evaluated, and the compiler doesn’t know what to do with it. That’s exactly why you get the Parse error: module header, import declaration or top-level declaration expected message.

Fixes to Try

1. Wrap Your Expression in a main Function

If you want to compile the file and run it to see the result of your expression, use main (Haskell’s required entry point for executables) and print to output the value:

module Main where

main = print $ fst (1,2)

Or if you want to test both fst and snd:

module Main where

main = do
  print $ fst (1,2)
  print $ snd (1,2)

Now you can compile with ghc ch4_test.hs and run the generated executable—it’ll print 1 and 2 respectively.

2. Bind Expressions to Top-Level Names

If you want to reuse these values later (or just make the code more structured), bind the expressions to names as top-level constants:

module Main where

firstPairValue = fst (1,2)
secondPairValue = snd (1,2)

main = do
  print firstPairValue
  print secondPairValue

This is valid because firstPairValue and secondPairValue are top-level declarations, which the compiler accepts.

3. Use runhaskell for Quick Testing

If you don’t want to compile to an executable, you can use runhaskell ch4_test.hs to run the file directly (again, make sure it has a valid main function like the examples above). This skips the compilation step and runs the code in an interpreter-like way, similar to GHCi.

内容的提问来源于stack exchange,提问作者Steve3p0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:35:11