Я тренируюсь для экзамена Haskell через 2 недели. Теперь я делаю некоторые упражнения, но я застрял на этом.Реализация выбора более 2 объективов в haskell
Реализовать функцию
choosing
, которая дается 2 линзы и должен вернуть новый объектив, который работает сEither
-значения.
Я дал этот код:
type Lens s a = forall f . Functor f => (a -> f a) -> s -> f s
--------------------------------------------------------------
-- Lens s1 a :: Functor f => a -> f a -> s1 -> f s1
-- Lens s2 a :: Functor f => a -> f a -> s2 -> f s2
-- Lens (Either s1 s2) a :: Functor f => a -> f a -> (Either s1 s2) -> f (Either s1 s2)
--------------------------------------------------------------
choosing :: Lens s1 a -> Lens s2 a -> Lens (Either s1 s2) a
choosing lns1 lns2 = undefined
Теперь, я полностью застрял. Я думаю, что я должен использовать fmap для решения этой проблемы, но я не знаю, как объединить эти 2 объектива.
Таким образом, с помощью @shang и @klappvisor я нашел полный ответ на этот вопрос:
choosing :: Lens s1 a -> Lens s2 a -> Lens (Either s1 s2) a
choosing lns1 lns2 = (\func x -> case x of
Left value -> (\z -> Left $ set lns1 z value) <$> (func (view lns1 value))
Right value -> (\z -> Right $ set lns2 z value) <$> (func (view lns2 value)))
Если вам не повезло и вы хотите увидеть решение, следуйте этой ссылке (http://lpaste.net/6450842794700308480) и прочитайте действительно [хорошая статья] (https://artyom.me/lens-over- чай-1) о линзах с точными вашими упражнениями в нем – klappvisor
@klappvisor: спасибо! Статья действительно удобна :) –