显式导入实例

我如何显式导入types类实例? 另外,如何通过合格的导入来执行此操作?

目前,我在做

import Control.Monad.Error () 

导入我可以使用的monad实例(Either String) 。 以前,我用过

 import Control.Monad.Error 

我不满意任何一个,因为Monad实例是隐式导入的。

无法控制实例的导入是Haskelltypes类系统所做的权衡之一。 下面是一个假设的哈斯克尔方言的例子,你可以:

Foo.hs:

 module Foo where data Foo = FooA | FooB deriving (Eq, Ord) 

Bar.hs:

 module Bar (myMap) where import Data.Map (Map) import qualified Data.Map as Map import Foo myMap :: Map Foo Int myMap = Map.singleton FooA 42 

Baz.hs:

 module Baz where import Data.Map (Map) import qualified Data.Map as Map import Foo hiding (instance Ord Foo) import Bar (myMap) instance Ord Foo where FooA > FooB = True FooB > FooA = False ouch :: Map Foo Int ouch = Map.insert FooB 42 myMap 

哎呀! set myMap是使用合适的instance Ord Foo创build的,但是它与一个用不同的 ,矛盾的实例创build的地图结合在一起。

能够这样做会违反Haskell的开放世界的假设 。 不幸的是,我不知道有一个好的,集中的资源来了解它。 RWH的这一部分可能会有帮助(我search“哈斯克尔开放世界的假设”)。

你不能。 实例总是隐式导出,因此您不能显式导入它们。 顺便说一下, Either eMonad实例现在在Control.Monad.Instances

虽然大体上正确的答案是“不,你不能”,我build议这个可怕的解决scheme:

复制+粘贴

查看所需模块的库源代码,并将必要的数据声明,导入和函数定义复制/粘贴到您自己的代码中。 不要复制你不想要的实例。

根据手头的问题, ghctypes系统扩展 OverlappingInstancesIncoherentInstances可能是一个替代解决scheme,尽pipe这可能无法解决base库的任何问题。