在map reduce过程中,无法从上下文(Ord k2)推断(k2~k4)



我正在haskell中进行映射缩减,我得到了一些代码来开始,但我遇到了一些编译器错误,我不理解其形式:

无法推导(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

谢谢你的帮助!

正如NathanHowell和alternative所说,发布实际的代码、错误和命令以进行编译或解释是很重要的。在这种情况下,您使用的是Glasgow Haskell,并且似乎试图使用ScopedTypeVariables扩展的功能,但实际上没有启用该扩展。

仅包括:

{-# LANGUAGE ScopedTypeVariables #-}

在源文件的顶部,或者在命令行中使用-XScopedTypeVariables,一切都很好。在没有作用域类型变量的情况下,k2的内部类型变量(reducePerKey和groupByKey的类型变量)与mapReduce函数的k2是不同的变量。

相关内容

  • 没有找到相关文章

最新更新