【发布时间】:2014-11-06 13:31:45
【问题描述】:
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 好的,很酷;到目前为止,一切都很好
1234563这只是上面表达式中这是我感到困惑的地方:作为例行检查,我执行与上述相同的
foldl',除了foldingFunc(代替flip $ uncurry (Map.insertWith (++))),这应该只是表面上的改变......现在 GHCi 报告类型不匹配错误(详情见上文)。
foldl' 的第一个参数。 (参见上面第三个ghci> 提示中的let 表达式。)
有人可以帮我理解为什么在这种情况下函数组合会导致错误(由于类型更改)吗?我应该做些什么不同的事情?
【问题讨论】:
-
您是否打开了
MonomorphismRestriction?b和foldingFunc的类型是什么? (在 ghci 中检查带有:t的类型。) -
bingo,刚关掉它现在可以正常工作了。多谢。如果您将评论复制粘贴到答案中,我会(很高兴!)接受
-
yatima2975 打败了我。 :)
-
@Rufflewind:抱歉,我在输入解释时没有看到您的评论 :-)
-
@yatima2975 不,没关系。你比我更详细!