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

时间:2011-02-23 20:59:50

标签: 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

输出

"foo"

1 个答案:

答案 0 :(得分:7)

  

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

详细说明一下,import只是说你的本地命名空间中有什么,所以要提及类型签名中的Doc类型,你必须导入它。 ghc在加载代码的依赖关系的同时在后台做了很多匹配类型(并搜索模块),但这些问题都是实现细节。