У меня возникает ошибка типа при попытке скомпилировать код объектива.Ошибка типа при работе с объективами
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens.Setter (over)
import Control.Lens.Getter (view)
import Control.Lens.TH
data IL = IL {
_ilL :: [Int]
}
deriving (Show)
makeLenses ''IL
val = IL [1, 2, 3]
(val1, val2) = let l = ilL
in (over l tail val, view l val)
Ошибка:
Test.hs:17:35:
Couldn't match expected type `Control.Lens.Internal.Getter.Accessor [Int] [Int]'
with actual type `Control.Lens.Internal.Setter.Mutator [Int]'
Expected type: Control.Lens.Getter.Getting [Int] s0 [Int]
Actual type: ([Int]
-> Control.Lens.Internal.Setter.Mutator [Int])
-> IL -> Control.Lens.Internal.Setter.Mutator IL
In the first argument of `view', namely `l'
In the expression: view l val
Эта ошибка уходит, если я использую Ill непосредственно. Тем не менее, мне действительно нужно сделать определение объектива, используя let. Как я могу это решить?
Вы согласны с тем, что я закрываю этот вопрос как дубликат [this] (http://stackoverflow.com/a/7055932/1651941)? Пара из нас здесь, на SO, пытается решить проблему стольких вопросов, ответ на который «Отключите DMR». Это не ваша вина, этот вопрос действительно трудно найти ответ на Google без предварительного знания DMR. Вот почему мы пытаемся связать как можно больше вопросов с одним каноническим ответом, мы пытаемся вызвать большое количество, казалось бы, разных вопросов к одному и тому же ответу, чтобы другим было легче в будущем. – bheklilr
Пожалуйста, вперед. – user3458168