好的,这里是语言中一个比较特殊的角落:
Haskell允许你导出一个标识符,其类型签名提到了一个没有被导出的类型。这到底意味着什么呢?
举个例子,假设我有以下代码:
module Foobar (bar) where
data Foo = ...
bar :: String -> Foo
Foo
没有被导出,而bar
被导出。虽然bar
的类型提到了Foo
,但许多编程语言不允许您这样做,但Haskell可以。
那现在怎么办?看起来我可以调用bar
,但是不能对其结果进行太多操作。特别是,我(可能)不能说出结果类型的名称,这有点奇怪。假设如果该模块导出了一些以Foo
作为输入的函数,则我应该能够使用我的结果作为输入调用这些函数...但整个过程中我无法在类型签名中表达出来。
当然,像上面这样做并不是一个好主意;我并不建议在实际代码中这样做。我只是好奇它实际上是做什么的。
Foo
的函数,也可以调用多态函数,但是您不能编写包含未导出名称的类型签名。 - kosmikus