我在做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
感謝您的幫助!
也許向我們展示完整的錯誤?也許還有完整的代碼,因爲你展示的內容中沒有一個'k4'? – alternative 2014-11-01 22:51:26
還有在命令行中指定的任何擴展......特別是啓用了「ScopedTypeVariables」? – 2014-11-01 23:00:52
@alternative'k4'只是GHC通過在其中添加/增加數字來區分不同版本的同名命名類型變量的習慣的結果。我不明白在代碼中使用編號類型的變量。 (如果啓用'RankNTypes',但* * * * ScopedTypeVariables',則可以看到錯誤。) – 2014-11-02 01:05:05