TL; DR:什么会导致GHCi中的类型不匹配错误纯粹是由于函数组合?这是奇怪地看到GHCI评估以下代码:Haskell:函数组合导致类型不匹配错误
foldl (a . b . c) crackle pop <- GHCi evaluates this`
......之后我们试图评估以下只给一个错误:
let snap = a . b . c <- GHCi evaluates this
foldl snap crackle pop <- GHCi reports an error (!)
较长的版本:
我对我在GHCi观察到的东西感到困惑,并希望有人能解释它(描述如下图所示):
做什么我们上面看到?:
首先,我们有一个变量
b
这势必以下列表:[(2,["Dipak"]), (2,["Andrew"]),(2,["Keone"])]
。b
是[(Int,[String])]
的类型。 (请参阅第一ghci>
提示和在屏幕截图所得到的输出的上方。)然后我们在
b
执行倍,将其转化为以下类型:Map (Integer, [String])
。我们通过使用基于insertWith (++)
的折叠功能来实现这种功能,该功能是起始累加器,即empty
映射。的功能如下(同下文中上面的屏幕截图的第二ghci>
提示(参见第二ghci>
提示上文)foldl' (flip $ uncurry (Map.insertWith (++))) (Map.fromList []) b
好的,凉爽;到目前为止,那么好
由于上面的
foldl'
函数是满口的,我决定组成一个折叠函数(名字为foldingFunc
),它等于flip $ uncurry (Map.insertWith (++))
,这只是上面表达式中的第一个参数foldl'
(见let
表达式在第三个。提示以上)这是我感到困惑:作为常规检查,我执行相同的
foldl'
如上,除了与foldingFunc
(代替flip $ uncurry (Map.insertWith (++))
),它应该简单地是一个外观上的改变...现在GHCi报告类型不匹配错误(详情如上)。
有人能帮我理解为什么在这种情况下,函数组合导致错误(由于类型改变)?我应该做什么不同?
你打开了“MonomorphismRestriction”吗? “b”和“foldingFunc”的类型是什么? (用ghci中的':t'检查类型。) – Rufflewind 2014-11-06 05:09:05
宾果游戏,刚刚关闭它,现在它正常工作。非常感谢。如果你复制粘贴你的评论到一个答案,我会(愉快地!)接受 – iceman 2014-11-06 05:22:33
yatima2975击败了我。 :) – Rufflewind 2014-11-06 05:53:27