按照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"
答案 0 :(得分:7)
Haskell可以看到这两个函数在没有Doc导入的情况下组合在一起吗?
是
详细说明一下,import
只是说你的本地命名空间中有什么,所以要提及类型签名中的Doc类型,你必须导入它。 ghc在加载代码的依赖关系的同时在后台做了很多匹配类型(并搜索模块),但这些问题都是实现细节。