我正在从Learn You a Haskell for Great Good!
学习Haskell的基础知识本书中有一个练习,您需要将Data.Map变为Functor。
我正在尝试创建自己的仿函数类型类,并将Data.Map转换为它的实例。
所以这就是我的尝试:
import Data.Map as DataMap
import Data.List as DataList
class MyFunctor f where
myfmap :: (a -> b) -> f a -> f b
instance MyFunctor (Ord k) => (DataMap.Map k) where
myfmap f x = DataMap.fromList $ DataList.map (\(p,q) ->(p,f q)) $ DataMap.toList x
当我尝试编译时,GHCI给了我这个错误:
`myfmap' is not a (visible) method of class `Map'
我试着查看其他SO答案,博客,邮件列表主题等,但没有太多运气。
我发现的唯一一件事是Haskell Wiki中的错误消息的描述,其中说GHCI在尝试实例化一个类时抛出此错误,但没有导入试图实现的函数。
我导入了Data.Map和Data.List,所以我认为这不是真正的原因。
我做错了什么?
答案 0 :(得分:12)
我注意到的第一件事是你的instance
语法不正确:
instance (Ord k) => MyFunctor (DataMap.Map k) where
...
否则看起来很好。
答案 1 :(得分:5)
可替换地:
import qualified Data.Map as M
class Functor' f where
fmap' :: (a -> b) -> f a -> f b
instance (Ord k) => Functor' (M.Map k) where
fmap' = M.map