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