【问题标题】:Making Data.Map a functor in Haskell使 Data.Map 成为 Haskell 中的函子
【发布时间】:2014-01-07 11:20:25
【问题描述】:

我正在从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,所以我认为这不是真正的原因。

我做错了什么?

【问题讨论】:

    标签: haskell dictionary functor


    【解决方案1】:

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

    instance (Ord k) => MyFunctor (DataMap.Map k) where
        ...
    

    否则看起来还不错。

    【讨论】:

    • 愚蠢的我。就是这样。谢谢!
    • myfmap f = M.fromList . map (second f) . M.toListhlint 也可以提供帮助
    • @TheInternet 是的。比我现在的版本简单。谢谢。
    • @AnupCowkur,这有点冗长,但 IMO 更具可读性。 lpaste.net/98091
    【解决方案2】:

    或者:

    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                 
    

    【讨论】:

    • 老实说,我相信 Tom Savage 的回答更具教学性,但我很确定 Miran 期待的内容与我所写的内容更加相似(基于他的代码列表作为Functor 类)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2011-08-25
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多