如何正确使用在另一个模块中声明的列表

Oto*_*ett 1 haskell

我遇到了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)

请知道为什么我会收到此错误?

lef*_*out 5

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的隐式doIO,即这就像

main :: IO ()
main = do
   let screens = ["stage one","stage two"]
   putStrLn $ head screens
Run Code Online (Sandbox Code Playgroud)