Mat*_*ick 32 import haskell typeclass
如何显式导入类型类实例?另外,如何使用合格的导入进行此操作?
目前,我正在做
import Control.Monad.Error ()
Run Code Online (Sandbox Code Playgroud)
导入我可以用于的monad实例(Either String).以前,我用过
import Control.Monad.Error
Run Code Online (Sandbox Code Playgroud)
我对其中任何一个都不满意,因为Monad实例是隐式导入的.
ehi*_*ird 47
无法控制实例的导入是Haskell类型类系统所做的权衡之一.这是一个假设的Haskell方言的例子,你可以:
Foo.hs:
module Foo where
data Foo = FooA | FooB deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
哎呀!该集合myMap是使用适当的创建的instance Ord Foo,但它与使用不同的,矛盾的实例创建的地图相结合.
能够这样做会违反Haskell的开放世界假设.不幸的是,我不知道有一个好的,集中的资源来学习它.RWH的这一部分可能会有所帮助(我搜索了"haskell开放世界假设").