我遇到了eoor:
> Levels.hs:3:40: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
3 | let screens = ["stage one","stage two"]
| ^
Run Code Online (Sandbox Code Playgroud)
当我尝试使用我在名为Levels. 下面是我的main.hs文件:
import System.IO
import Levels
main = do
putStrLn (head Levels.screens)
Run Code Online (Sandbox Code Playgroud)
下面是我的 Levels.hs
module Levels where
let screens = ["stage one","stage two"]
Run Code Online (Sandbox Code Playgroud)
请知道为什么我会收到此错误?
let仅用于声明某个范围内的变量 - 函数或 monadic 块的范围。基本上它的作用是创建一个新的顶级环境,然后您可以在其中声明变量。
但是在编写源文件时,您已经处于顶层,因此您不需要(实际上不能)使用let.
把它写出来就像
module Levels where
screens = ["stage one","stage two"]
Run Code Online (Sandbox Code Playgroud)
...最好也添加一个类型签名
screens :: [String]
Run Code Online (Sandbox Code Playgroud)
您可以使用的地方let是您是否需要一些帮助程序定义来实现该列表,例如
screens = let stage1 = "stage one"
stage2 = "stage two"
in [stage1, stage2]
Run Code Online (Sandbox Code Playgroud)
或者,因为它会更常见地被写成,
screens = [stage1, stage2]
where stage1 = "stage one"
stage2 = "stage two"
Run Code Online (Sandbox Code Playgroud)
请注意,let在 GHCi 中使用时,例如
Prelude> let screens = ["stage one","stage two"]
Prelude> screens
["stage one","stage two"]
Run Code Online (Sandbox Code Playgroud)
您已经在一个范围内,即monad的隐式do块IO,即这就像
main :: IO ()
main = do
let screens = ["stage one","stage two"]
putStrLn $ head screens
Run Code Online (Sandbox Code Playgroud)