2014-11-01 43 views
1

我在做haskell中的map reduce,並且給出了一些代碼來開始,但我得到一些編譯器錯誤,不理解的形式爲:無法在地圖縮減過程中從上下文(Ord k2)中推導出(k2〜k4)

無法推斷(K2〜K4)從上下文 (ORD K2)

下面的代碼:

import Data.Map (Map,empty,insertWith,mapWithKey,filterWithKey,toList) 


mapReduce :: forall k1 k2 v1 v2 v3. Ord k2 
      => (k1 -> v1 -> [(k2,v2)]) 
      -> (k2 -> [v2] -> Maybe v3) 
      -> Map k1 v1 
      -> Map k2 v3 

mapReduce mAP rEDUCE = reducePerKey . groupByKey . mapPerKey 
    where 
     mapPerKey :: Map k1 v1 -> [(k2,v2)] 
     mapPerKey = 
      concat 
      . map (uncurry mAP) 
      . toList 

     groupByKey :: [(k2,v2)] -> Map k2 [v2] 
     groupByKey = foldl insert empty 
      where 
       insert dict (k2,v2) = insertWith (++) k2 [v2] dict 

     reducePerKey :: Map k2 [v2] -> Map k2 v3 
     reducePerKey = 
      mapWithKey unJust 
      . filterWithKey isJust 
      . mapWithKey rEDUCE 
      where 
       isJust k (Just v) = True 
       isJust k Nothing = False 
       unJust k (Just v) = v 

感謝您的幫助!

+2

也許向我們展示完整的錯誤?也許還有完整的代碼,因爲你展示的內容中沒有一個'k4'? – alternative 2014-11-01 22:51:26

+1

還有在命令行中指定的任何擴展......特別是啓用了「ScopedTypeVariables」? – 2014-11-01 23:00:52

+0

@alternative'k4'只是GHC通過在其中添加/增加數字來區分不同版本的同名命名類型變量的習慣的結果。我不明白在代碼中使用編號類型的變量。 (如果啓用'RankNTypes',但* * * * ScopedTypeVariables',則可以看到錯誤。) – 2014-11-02 01:05:05

回答

1

正如NathanHowell和其他人所說的,重要的是你發佈實際的代碼,錯誤和編譯或解釋命令。在這種情況下,您使用的是格拉斯哥Haskell,它似乎嘗試使用ScopedTypeVariables擴展的功能,但未實際啓用該擴展。

就包括:

{-# LANGUAGE ScopedTypeVariables #-} 

在源文件的頂部,或者在命令行中使用-XScopedTypeVariables,事情做工精細。如果沒有作用域類型變量,則k2(針對reducePerKey和groupByKey)的內部類型變量是與針對mapReduce函數的k2不同的變量。

+0

對於缺少細節感到抱歉,問題在於缺少ScopedTypeVariables標誌。對於Haskell,我仍然是一個新手。一切都很好,謝謝你的回答:) – FintanH 2014-11-02 14:17:12