为什么我不能像正常变量一样绑定和重用一个haskell镜头?

时间:2015-05-29 19:59:08

标签: haskell lenses

(我正在使用镜头系列,而不是镜头)

我有一个相当深的数据结构,我需要关注具有共同路径的两个部分。因此,我非常直观地定义_table以重用它:

let _table = _sOutput.at (O.tName table)._Just'
tp' <- evalCacheable (_table.O._stPerm) M.empty
... reuse _table

但这会产生错误:

Could not deduce (Functor f0) arising from a use of ‘_sOutput’
from the context (MonadReader (EvalConf State All) m, ...

然而,直接将_table的值粘贴到参数中会起作用:

tp' <- evalCacheable (_sOutput.at (O.tName table)._Just'.O._stPerm) M.empty

发生了什么事?我可以提供有关所涉及类型的更多细节,但对我而言,这似乎令人费解。我的印象是

let x = y
z <- f x

相当于

z <- f y

在所有情况下。

1 个答案:

答案 0 :(得分:4)

这可能与单态限制有关。尝试将{-# LANGUAGE NoMonomorphismRestriction #-}放在文件的顶部。 - randomusername

有效! #haskell上的某人也通过向_table添加显式类型签名来解决此问题。根据他的说法Rank2Types正在弄乱类型推断。 - BruceBerry