Haskell 不在范围内,但它被全名调用

Haskell 不在范围内,但它被全名调用,haskell,Haskell,一个简单的问题: case (HashMap.lookup "last" jsonObject) of (Just (String val)) -> Data.Text.IO.putStrLn val 它表示不在范围内:Data.Text.IO.putStrLn。这怎么可能呢?在Haskell源文件中,您还必须导入您希望使用的任何模块-仅以限定名称引用符号是不够的 所以加上 import qualified Data.Text.IO 到源文件的顶部。如果您还想直接引用putStrL

一个简单的问题:

case (HashMap.lookup "last" jsonObject) of
  (Just (String val)) -> Data.Text.IO.putStrLn val

它表示
不在范围内:Data.Text.IO.putStrLn
。这怎么可能呢?

在Haskell源文件中,您还必须导入您希望使用的任何模块-仅以限定名称引用符号是不够的

所以加上

import qualified Data.Text.IO
到源文件的顶部。如果您还想直接引用
putStrLn
,您可以省略
qualified
关键字

在这种特殊情况下,您还需要在
Prelude
中“隐藏”版本,因为
putStrLn
是一个标准库函数

import Prelude hiding ( putStrLn )

请注意,可以在ghci提示符处直接引用符号,这可能是此处的一个混淆源。

尽管ghci(而非ghc)将只访问名称用作名称限定符的任何模块。您也可以在此处使用限定导入。