类型签名需要一个未由库导出的类型

Emi*_*mil 8 haskell ghc aeson

所以我使用了aeson库,并认为拥有以下功能非常有用:

v .:! f = liftM (fromMaybe mempty) (v .:? f)
Run Code Online (Sandbox Code Playgroud)

当我问GHCi的类型时,我得到:

(.:!)
  :: (Monoid r, FromJSON r) =>
     Object
     -> T.Text -> aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser r
Run Code Online (Sandbox Code Playgroud)

然而,解析器本身实际上并不无论是出口Data.Aeson还是Data.Aeson.Types.我被迫没有为我定义的功能设置类型签名吗?

或者,如果有人知道更好的方式来完成我想要做的事情,我会对你的建议感兴趣.

GS *_*ica 6

目前,在 Haskell 中完全有可能编写具有推断类型的代码,但由于未导出的符号,您无法自己编写该推断类型。2014 年 4 月,Haskell 库邮件列表上对此进行了讨论,没有得出明确的结论,但普遍的看法是保持当前的行为。

但是,一般规则是,如果需要语言扩展来编写要推断的类型签名,那么即使您没有显式包含签名,也需要启用该扩展。

  • 我认为如果导出的函数的类型在其他模块中无法表达,则应该出现编译器警告。 (5认同)