我有點困惑,不知道在哪裏尋找下面的「問題」的信息/解釋(這本身不是一個問題,但更多的情況下,我不明白什麼是錯的幕後):哈斯克爾鏡頭:讓綁定遍歷'
我有StateT一個單子轉換堆棧。在我的函數中的某個時候,我想將我的狀態的一小部分綁定到局部變量中,以便我可以參考它,而不是寫出我感興趣的狀態塊的整個路徑。意思是:
{-# LANGUAGE ScopedTypeVariables #-}
...
someFunction :: MyMonad()
someFunction = do
...
let x :: Traversal' MyState MyDataT = myState.clients.ix clientIdx.someData.ix dataIdx
...
現在,這並不編譯:
Couldn't match type ‘(MyDataT -> f0 MyDataT)
-> MyState -> f0 MyState’
with ‘forall (f :: * -> *).
Control.Applicative.Applicative f =>
(MyDataT -> f MyDataT) -> MyState -> f MyState’
但如果我搬到這個數據塊的引用到一個函數,那麼一切OK編譯:
someFunction :: MyMonad()
someFunction = do
...
let x = clientData clientIdx dataIdx
...
where clientData :: Int -> Int -> Traversal' MyState MyDataT
clientData clientIdx dataIdx = myState.clients.ix clientIdx.someData.ix dataIdx
我我正在尋找某種信息來幫助我瞭解這裏發生了什麼,爲什麼會發生,以便我知道我做錯了什麼。基本上我想擴展我的知識,以更好地理解這個用例。
非常感謝,這是非常有幫助的 – ksaveljev