为什么我不能像普通变量一样绑定和重复使用 Haskell镜头?



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

我有一个相当深的数据结构,我需要关注具有共同路径的两个部分。因此,我非常直观地定义了_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

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

工作!有人在#haskell上也通过向_table添加显式类型签名解决了这个问题。根据他的说法,Rank2Types扰乱了类型推断。——BruceBerry

相关内容

最新更新