如何忽视标准模块?

时间:2017-05-18 21:36:48

标签: haskell functor either

作为练习,我正在尝试实现我自己的标准Functor版本,在本例中为Either

我的代码与标准定义类似:

instance Functor (Either a) where
  fmap _ (Left x) = Left x
  fmap f (Right y) = Right (f y)

当我尝试编译它时,我收到以下错误:

ghc --make either.lhs
[1 of 1] Compiling Main             ( either.lhs, either.o )

either.lhs:14:12: error:
    Duplicate instance declarations:
      instance Functor (Either a) -- Defined at either.lhs:14:12
      instance Functor (Either a) -- Defined in ‘Data.Either’
make: *** [hs] Error 1

编译器发现与Data.Either中定义的标准实例发生冲突。尽管我实际上并没有在我的代码中导入Data.Either模块。我想编译和测试我自己的Functor实现 - 是否有某些方法可以隐藏Data.Either来自编译器以避免冲突?

1 个答案:

答案 0 :(得分:2)

您有两种选择:

定义您自己的Either

module Foo where
import Prelude hiding (Either)

data Either a b = Left a | Right b

instance Functor (Either a) where ...

定义您自己的Functor

module Bar where
import Prelude hiding (Functor)

class Functor f where
  fmap :: (a -> b) -> f a -> f b

instance Functor (Either a) where ...

正如您所发现的那样,您也可以只填写非冲突名称,而不是隐藏Prelude中的内容。但学会隐藏东西非常重要;例如,您将看到许多程序执行此操作:

import Control.Category
import Prelude hiding (id, (.))

那是因为这些程序想要使用来自id的更一般的(.)Control.Category而不是前奏中的division(x, y)