gpt4 book ai didi

haskell - 有什么更好的写法[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1), (1,0),(1,1)] 在 Haskell 中?

转载 作者:行者123 更新时间:2023-12-03 14:26:49 26 4
gpt4 key购买 nike

我遇到了一些需要列表的情况:

[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)] -- no (0,0)

请注意,列表中没有 (0,0)。我使用 (dx,dy) 元组从坐标向上、向下、向左、向右和对角搜索。

每次我写它时,我都觉得应该有一种更简洁和/或更容易阅读的方式来定义它。我对 Haskell 比较陌生,我认为在 Applicative/Functor/Monad 技巧的某个地方应该有一种巧妙的方法来做到这一点。

我试过了:
[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]

有时最好把它写出来,但我不认为这是其中之一。乍一看,不包括 (0,0) 并不明显,您必须阅读一下才能注意到模式。
map (\[a,b] -> (a,b)) $ delete [0,0] $ sequence $ replicate 2 [-1,0,1]

我喜欢上面的那个,因为我可以把“2”放在那里,这是一种很好的明确方式来表达“我们两次做同样的事情”,但我不能接受前面的大 map 不安全的 lambda 和 2 个名称。
[(dx,dy) | let a = [-1,0,1], dx <- a, dy <- a, (dx,dy) /= (0, 0)]

这个名字太多了,但是完全按照它的设计使用列表推导。对于真正喜欢列表推导的人来说可能更容易阅读,但我不喜欢所有的名字。
let x = [-1,0,1] in delete (0,0) $ (,) <$> x <*> x

那个看起来更漂亮,但我没有那个“2”,而且我有一个名字。到目前为止,这是我最喜欢的,但感觉并不完美。

我想如果我能更好地理解如何写这个,我可能会对 Functors/Monads 等有更深入的了解。我已经阅读了很多关于它们的内容,并且我听说过很多诸如 fmap/mconcat/etc 之类的词,但我不知道在这种情况下该捕获哪个词。

最佳答案

实际上,我认为在这种情况下最好明确地写出来。只需合理地调整它,就不会有任何问题:

neighbours = [ (-1,-1), (-1,0), (-1,1)
, ( 0,-1), ( 0,1)
, ( 1,-1), ( 1,0), ( 1,1) ]

没有比这更不言自明的替代方案了。

当然,还有更简洁的替代方案。作为一个物理人,我倾向于
   [ (round $ - sin φ, round $ - cos φ) | φ <- [pi/4, pi/2 .. 2*pi] ]

这当然计算起来更昂贵,但是如果你只在一个地方定义这个列表并在你的整个程序中重新使用它,这并不重要。这里的顺序不同,不确定是否重要。

关于haskell - 有什么更好的写法[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1), (1,0),(1,1)] 在 Haskell 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321372/

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