当使用与该类型的值一起使用的函数时,为什么不必导入抽象类型

Bor*_*ris 5 haskell

按照Real World Haskell第5章的练习,我最终得到了Prettify.hs,它除了其他东西外还输出了一个抽象类型的Doc和一个渲染函数compact,它是一个从Doc到String的函数.另一个文件PrettyJSON.hs导出renderJValue,最终给我一个Doc值.在我的主要部分中,我只导入renderJValue和compact,并使用一个输出作为另一个的输入.我很困惑为什么这样做.我认为导入抽象的Doc类型也是必要的.Haskell可以看到这两个函数在没有Doc导入的情况下组合在一起吗?

为了说明,这是我的Main.hs:

module Main where

import System.IO
import SimpleJSON (JValue(..))
import PrettyJSON (renderJValue)
import Prettify (compact)

main = do
    let val = renderJValue $ JString "foo"
    putStrLn $ compact val
    getLine
Run Code Online (Sandbox Code Playgroud)

哪个输出

"foo"
Run Code Online (Sandbox Code Playgroud)

bar*_*oap 7

Haskell可以看到这两个函数在没有Doc导入的情况下组合在一起吗?

是.

为了详细说明,你import只是说你的本地命名空间中有什么,所以要提到类型签名中的Doc类型,你必须导入它.在加载代码的依赖关系时,ghc正在后台执行大量匹配类型(并搜索模块),但这些问题是实现细节.