MTL库需要哪些语言扩展?

Mat*_*ick 8 haskell typeclass monad-transformers language-extension

我试图通过基于现有设计实现我自己的小型库来理解monad变换器.

我坚持的是语言扩展.在MonadError中,提到的唯一扩展是UndecidableInstances.但是,我无法使用FunctionalDependencies和编译代码来编译FlexibleInstances.

我认为需要FunDeps的例子:

class (Monad m) => MonadError e m | m -> e where
Run Code Online (Sandbox Code Playgroud)

一个灵活的实例:

instance MonadError e m => MonadError e (MaybeT m) where
Run Code Online (Sandbox Code Playgroud)

MonadError代码如何避免额外的两个扩展?

sha*_*ang 11

您不必拼写源文件本身的所有扩展名.所有/大多数模块使用的公共扩展可以列在项目的cabal文件中.在mtl的情况下:

extensions:
    MultiParamTypeClasses
    FunctionalDependencies
    FlexibleInstances
Run Code Online (Sandbox Code Playgroud)

  • 注意:您可以执行此操作,但许多人更喜欢在每个文件中拼写带有"LANGUAGE"编译指示的扩展名.这样文件可以是独立的,也可以是ghci-able,并且很容易看到每个特定文件正在使用哪些扩展,因为您不需要为每个文件打开每个扩展.这取决于您使用的扩展程序以及普遍使用的扩展程序. (7认同)
  • 两者都很有用.我认为推荐的方法应该是使用`LANGUAGE`编译指示根据需要拼出扩展,并在Cabal的`other-extensions`字段中记录包所需的扩展.默认情况下,"其他扩展名"列表未启用,但它仍可用于了解程序包具有的扩展要求(无需单独查看所有源文件). (2认同)