[英]Is there an easy way to work with values of type Map k1 (Map k2 v)
[英]Could not deduce (k2 ~ k4) from the context (Ord k2) during map reduce
我正在使用haskell进行map reduce,并获得了一些开始的代码,但是却遇到了一些我不了解该格式的编译器错误:
无法从上下文(Ord k2)推论(k2〜k4)
这是代码:
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
谢谢您的帮助!
正如NathanHowell及其替代者所说,重要的是您发布实际的代码,错误和命令以进行编译或解释。 在这种情况下,您正在使用Glasgow Haskell,并且似乎在尝试使用ScopedTypeVariables
扩展的功能,但实际上并未启用该扩展。
只需包括:
{-# LANGUAGE ScopedTypeVariables #-}
在源文件的顶部,或在命令行中使用-XScopedTypeVariables
,一切正常。 如果没有作用域类型变量,则k2
的内部类型var(用于reducePerKey和groupByKey的变量)与针对mapReduce
函数的k2
变量不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.