作为练习,我正在尝试实现我自己的标准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来自编译器以避免冲突?
答案 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)
。