为什么这个缩进是错误的?

3

这段代码会产生以下编译错误:

Error:(17, 1) ghc: parse error (possibly incorrect indentation or mismatched brackets)

但是如果我删除

标签

module Main where

它起作用了。由于我刚开始使用Haskell,我想知道为什么?

module Main where

{-# LANGUAGE QuasiQuotes #-}

import Text.Hamlet (shamlet)
import Text.Blaze.Html.Renderer.String (renderHtml)
import Data.Char (toLower)
import Data.List (sort)

data Person = Person
    { name :: String
    , age  :: Int
    }

main :: IO ()
main = putStrLn $ renderHtml [shamlet|
<p>Hello, my name is #{name person} and I am #{show $ age person}.
<p>
    Let's do some funny stuff with my name: #
    <b>#{sort $ map toLower (name person)}
<p>Oh, and in 5 years I'll be #{show ((+) 5 (age person))} years old.
|]
  where
    person = Person "Michael" 26
1个回答

10

这条线

{-# LANGUAGE QuasiQuotes #-}

程序开头应该写它,放在其他代码之前。

module Main where

这些语言扩展被认为是程序本身之外的元信息(它们也可以作为ghc的命令行选项包含在内)。


3
这个。如果有LANGUAGE编译指示,它必须始终是文件中的第一行代码。(可能还有其他规则,但我目前想不出来。) - MathematicalOrchid
1
@MathematicalOrchid:它也可以跟随注释和仅包含空格的行,只要它是第一行有意义的代码。 (因此它不像shebang那样严格)。 - Antal Spector-Zabusky
1
实际上,LANGUAGE pragma 和 OPTIONS_GHC pragma 必须作为文件中第一个非注释、非空格的块出现。当然,你可以有多个这样的行,但它们不能都是第一个 :-) - Antal Spector-Zabusky

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