gpt4 book ai didi

haskell - 在haskell中实现选择2个以上的镜头

转载 作者:行者123 更新时间:2023-12-02 17:34:00 25 4
gpt4 key购买 nike

我正在练习两周后的 Haskell 考试。现在我正在做一些练习,但我被困在这一项上。

Implement a function choosing that is given 2 lenses and should return a new lens that works with Either-values.

我得到了这个代码:

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 来解决这个问题,但我不知道如何组合这两个镜头。

因此,在@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)))

最佳答案

这是一个很好的练习问题,因为您甚至不需要了解有关镜片的任何知识即可实现该解决方案。您只需遵循类型即可。

choosing :: Lens s1 a -> Lens s2 a -> Lens (Either s1 s2) a
choosing lns1 lns2 = undefined

返回类型Lens (Either s1 s2) aforall f . Functor f => (a -> f a) -> Either s1 s2 -> f (Either s1 s2) 的别名所以你知道你必须返回某种带有两个参数的函数:

choosing lns1 lns2 = \func x -> undefined

func的类型是 (a -> f a)xEither s1 s2 类型的值。我们不能用 func 做太多事情但我们对 x 已经足够了解了我们可以对其进行模式匹配:

choosing lns1 lns2 = \func x -> case x of
Left l -> undefined
Right r -> undefined

现在,使用lns1 , lns2 , func以及类型 f 的知识是一个仿函数(因此您可以使用 fmap ),您只需要实现 case 表达式的分支,以便两者都生成 f (Either s1 s2) 类型的值.

关于haskell - 在haskell中实现选择2个以上的镜头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37522307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com