Haskell 映射还原期间无法从上下文(Ord k2)推断(k2~k4)

Haskell 映射还原期间无法从上下文(Ord k2)推断(k2~k4),haskell,mapreduce,Haskell,Mapreduce,我正在haskell中进行map reduce,我得到了一些代码开始,但我得到了一些编译器错误,我不理解这种形式: 无法推断(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)

我正在haskell中进行map reduce,我得到了一些代码开始,但我得到了一些编译器错误,我不理解这种形式:

无法推断(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所说,发布用于编译或解释的实际代码、错误和命令非常重要。在本例中,您使用的是格拉斯哥Haskell,并且似乎试图使用
ScopedTypeVariables
扩展的功能,但实际上没有启用扩展

仅包括:

{-# LANGUAGE ScopedTypeVariables #-}

在源文件的顶部,或者在命令行中使用
-XScopedTypeVariables
,一切正常。如果没有作用域类型变量,
k2
的内部类型变量(reducePerKey和groupByKey的内部类型变量)与
mapReduce
函数的
k2
的内部类型变量不同。

可能会告诉我们全部错误?也许还有完整的代码,因为在您显示的内容中没有一个单独的
k4
?还有在命令行上指定的任何扩展。。。特别是,
ScopedTypeVariables
是否启用?@备选方案
k4
只是GHC习惯于通过向不同版本的同名类型变量添加/递增数字来消除其歧义的结果。这不太适合在代码中使用编号类型变量,我明白了。(如果启用
RankNTypes
但不启用
ScopedTypeVariables
,则可以看到错误)很抱歉,缺少详细信息,问题是缺少ScopedTypeVariables标志。说到哈斯克尔,我还是个新手。现在一切都好了,谢谢你的回答:)