TL;DR: 纯粹由于函数组合,什么原因会导致GHCi出现类型不匹配错误?看到GHCi评估以下代码确实很奇怪:
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'
表达式中的第一个参数。 (请参见上面第三个ghci>
提示中的let
表达式。)这就是我感到困惑的地方:作为例行检查,我执行与上面相同的
foldl'
,只不过使用foldingFunc
(而不是flip $ uncurry (Map.insertWith (++))
),这应该只是一种外观上的改变...但现在GHCi报告类型不匹配错误(详细信息如上所述)。
请问有人能帮助我理解为什么函数组合在这种情况下导致了错误(由于类型更改导致)?我应该做些什么不同的事情吗?
MonomorphismRestriction
?变量b
和foldingFunc
的类型是什么?(在ghci中使用:t
查看它们的类型。) - Rufflewind