明确导入实例

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开放世界假设").

  • 从技术上讲,您无法通过语言标准命令在Haskell 98中编写包含相同类型和类的冲突实例的程序.但是,GHC并不总是检测到冲突的实例,因此它接受一些不应该符合标准的程序. (4认同)
  • 意思是,如果想要走那条路,你必须先将实例设为第一类,这样一个Map可以携带它的Ord字典吗? (3认同)

Dan*_*her 7

你不能.实例始终是隐式导出的,因此您无法显式导入它们.顺便说一句,现在Either eMonad情况是Control.Monad.Instances.