为什么我不能像普通变量一样绑定和重复使用 haskell 镜头?
Why can't I bind and reuse a haskell lens like a normal variable?
(我用的是镜头系列,不是镜头)
我有一个相当深的数据结构,我需要关注具有共同路径的两个部分。所以非常直观地,我定义 _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 #-}
放在文件的顶部。 –
成功了! #haskell
上也有人通过向 _table
添加显式类型签名来解决它。据他说 Rank2Types
搞乱了类型推断。 –
(我用的是镜头系列,不是镜头)
我有一个相当深的数据结构,我需要关注具有共同路径的两个部分。所以非常直观地,我定义 _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 #-}
放在文件的顶部。 –
成功了! #haskell
上也有人通过向 _table
添加显式类型签名来解决它。据他说 Rank2Types
搞乱了类型推断。 –