我是一名有用的助手,可以为您翻译以下内容:
在ghci提示符下执行以下操作没有问题:
然而,当我试着将其参数化为一个函数时,我会得到以下错误。
我很难理解Haskell语言中镜头库的所有细微差别。
假设我拥有以下镜头
activePlayer :: Lens' Game Player
activePlayer = lens get set
where
get (Game {_players = (index, seq) }) = S.index seq index
set g@(Game {_players = (index, seq) }) player =
g { _players = (index, S.update index player seq) }
在ghci提示符下执行以下操作没有问题:
> :t do{use (activePlayer); activePlayer.= undefined}
:: Control.Monad.State.Class.MonadState Game m => m ()
然而,当我试着将其参数化为一个函数时,我会得到以下错误。
> :t \p -> do{use p; p.=undefined}
<interactive>:1:17:
Couldn't match type `Accessor a0 a0' with `Mutator b0'
Expected type: ASetter s0 s0 a0 b0
Actual type: Getting a0 s0 a0
In the first argument of `(.=)', namely `p'
In a stmt of a 'do' block: p .= undefined
In the expression:
do { use p;
p .= undefined }
看起来p
被推断为Accessor
,但我希望它被推断为完整的Lens
。我尝试使用以下方法强制使p
成为一个Lens
,但是ghci在Lens' a b
中抱怨RankNTypes。
:t \p -> do{use p; p.=undefined} :: Lens' a b -> m c
如果有人能帮我弄清楚为什么p
会被推断成现在的样子,以及如何使其表现得像一个完整的Lens
,那将不胜感激。
RankNTypes
了吗? - Daniel Wagner