2014-01-07 24 views
8

我從Learn You a Haskell for Great Good!製作Data.Map仿函數在Haskell

學習哈斯克爾的基礎知識有在你需要做Data.Map成函子書的練習。

我試圖做我自己的functor typeclass,並使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,所以我不認爲這是真正的原因。

我在做什麼錯?

回答

12

我注意到的第一件事是,你instance語法是不完全正確:

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

否則,它似乎罰款。

+0

愚蠢的我。就是這樣。謝謝! –

+4

'myfmap f = M.fromList。地圖(第二個f)。 M.toList' hlint也可以幫助 –

+0

@TheInternet是。比我現在的版本更簡單。謝謝。 –

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     
+0

我真的相信湯姆薩維奇的答案更具教育意義,但我很確定米蘭期待着更多的東西我寫的東西(根據他的代碼列表作爲Functor類的實例)。 – DeadDork