显式导入实例
我如何显式导入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 e
的Monad
实例现在在Control.Monad.Instances
。
虽然大体上正确的答案是“不,你不能”,我build议这个可怕的解决scheme:
复制+粘贴
查看所需模块的库源代码,并将必要的数据声明,导入和函数定义复制/粘贴到您自己的代码中。 不要复制你不想要的实例。
根据手头的问题, ghctypes系统扩展 OverlappingInstances
或IncoherentInstances
可能是一个替代解决scheme,尽pipe这可能无法解决base
库的任何问题。