gpt4 book ai didi

haskell - 教程中的简单 haskell 透镜违反了透镜定律

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

我正在阅读本教程:

http://blog.jakubarnold.cz/2014/08/06/lens-tutorial-stab-traversal-part-2.html

我的代码如下所示:

import Control.Applicative
import Data.Traversable
import Control.Lens

data User = User String [Post] deriving Show
data Post = Post String deriving Show

posts :: Lens' User [Post]
posts f (User n p) = fmap (User n) (f p)

users :: [User]
users = [User "john" [Post "hello", Post "world"], User "bob" [Post "foobar"]]

tp :: (Traversable t, Applicative f) => ([Post] -> f [Post]) -> t User -> f (t User)
tp = traverse . posts

现在,在博客文章之后,以下是一些常见的镜头计算:

*Main> view tp users
[Post "hello",Post "world",Post "foobar"]

*Main> set tp [Post "x",Post "y"] users
[User "john" [Post "x",Post "y"],User "bob" [Post "x",Post "y"]]

*Main> view tp (set tp [Post "x",Post "y"] users)
[Post "x",Post "y",Post "x",Post "y"]

最后的评价让我很困惑。下面的透镜定律不应该成立吗?

view l (set l v s) = v

(该定律取自 http://artyom.me/lens-over-tea-2 。)

最佳答案

这是透镜定律,而tp是遍历,所以不必遵守这个定律。

严格来说,view根本不应该与遍历一起工作(它无论如何都可以工作,但它是通过将收集到的结果进行幺半群组合来实现的)。

关于haskell - 教程中的简单 haskell 透镜违反了透镜定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463638/

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