为什么“变量不在范围内”

时间:2019-05-12 12:51:57

标签: haskell

代码有什么问题。

我的Haskell平台是新的。而且我已经尝试过多次调整格式。但这并不总是有效。

import Data.Char
import Data.List

encode :: Int -> String -> String
encode shift msg =
    let ords = map ord msg
    shifted = map (+ shift) ords
    in map chr shifted

结果总是这样

Prelude> :r
Ok, no modules loaded.
Prelude> :type encode

<interactive>:1:1: error: Variable not in scope: encode

当我加载文件时,它会显示

Prelude> :l H2-2.hs
[1 of 1] Compiling Main             ( H2-2.hs, interpreted )

H2-2.hs:56:3: error: parse error on input ‘shifted’
   |
56 |   shifted = map (+ shift) ords
   |   ^^^^^^^
Failed, no modules loaded.

1 个答案:

答案 0 :(得分:6)

您的代码中存在缩进错误。此处已得到纠正:

encode :: Int -> String -> String
encode shift msg =
    let ords = map ord msg
        shifted = map (+ shift) ords
    in map chr shifted

在诸如let ... in ...where ...do ...等的块中,重要的是不允许后续行的缩进落后于第一行的缩进–这称为“越​​位”规则”,这就是Haskell如何确定什么属于哪个区块。

使用ghci H2-2.hs启动GHCi或写入:l H2-2.hs以加载文件。加载完成后,如果要加载其他更改,则只能使用:r