使Data.Map成为Haskell中的一个函子

Anu*_*kur 9 dictionary haskell functor

我正在学习Haskell的基础知识,从了解你是一个很好的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
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,GHCI给了我这个错误:

`myfmap' is not a (visible) method of class `Map'
Run Code Online (Sandbox Code Playgroud)

我试着寻找其他SO答案,博客,邮件列表线程等,没有太多运气.

我发现的唯一的事情就是Haskell Wiki中错误消息的描述,该错误消息说GHCI在尝试实例化一个类时抛出此错误,但没有导入试图实现的函数.

我导入了Data.Map和Data.List,所以我认为这不是真正的原因.

我究竟做错了什么?

Tom*_*age 13

我注意到的第一件事是你的instance语法不正确:

instance (Ord k) => MyFunctor (DataMap.Map k) where
    ...
Run Code Online (Sandbox Code Playgroud)

否则看起来很好.

  • `myfmap f = M.fromList.地图(第二个f).M.toList`hlint也可以提供帮助 (4认同)

小智 6

或者:

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                 
Run Code Online (Sandbox Code Playgroud)