Haskell “a”中相邻元素对的惰性生成;循环清单“;
要检查光线与三角形的碰撞,我们可以首先查看光线是否与三角形的平面碰撞。如果有,我们检查所有三角形边的交点是否在同一侧。如果为true,则表示该点位于三角形内。此过程类似于矩形和其他凸面图形 这是属于矩形的顶点列表(按逆时针顺序排列): 我想生成一个包含所有方面的列表;即,所有相邻的顶点对:Haskell “a”中相邻元素对的惰性生成;循环清单“;,haskell,lazy-evaluation,circular-list,Haskell,Lazy Evaluation,Circular List,要检查光线与三角形的碰撞,我们可以首先查看光线是否与三角形的平面碰撞。如果有,我们检查所有三角形边的交点是否在同一侧。如果为true,则表示该点位于三角形内。此过程类似于矩形和其他凸面图形 这是属于矩形的顶点列表(按逆时针顺序排列): 我想生成一个包含所有方面的列表;即,所有相邻的顶点对: vertexPairs = [(ll, lr), (lr, ur), (ur, ul), (ul, ll)] (请注意,最后一个顶点ul也与第一个顶点ll成对) 假设我有一个顶点的有序列表,我如何才能懒洋洋
vertexPairs = [(ll, lr), (lr, ur), (ur, ul), (ul, ll)]
(请注意,最后一个顶点ul也与第一个顶点ll成对)
假设我有一个顶点的有序列表,我如何才能懒洋洋地为一个通用的凸几何图形生成这样一个列表
其思想是将每个对馈送给函数isInside,并检查其所有返回值是否相同。这就是我正在做的:
1. vertexes = [<list of vertexes>]
2. vertexPairs = ???
3. results = map (\(v1, v2) -> isInside point v1 v2) vertexPairs
4. allequal = all (== head results) (tail results)
是的,这种生成列表的方法是懒惰的。通常,Haskell中的列表函数是惰性的 您可以通过在初始列表中包含将出错的内容(例如,
未定义的
)来测试它是否懒惰。例如,如果
vertexes = [(0,0), (10,0), undefined, undefined]
然后,vertexPairs
将给您一个错误(因为它需要计算整个列表才能打印)。但是,如果它是懒惰的,head vertexPairs
仍然应该为您提供正确的一对-它确实如此
我认为你的代码实际上看起来相当不错。tail vertexs++[head vertex]
使您的操作非常清晰。是的,在这里使用++
看起来有点奇怪,但它是有意义的:在列表末尾追加是一个昂贵的操作,因此它应该很突出。我想不出任何更好的方法来编写代码。作为一个次要的样式提示,您可以在顶点周围放置括号
:
vertexPairs = zip vertexes (tail vertexes ++ [head vertexes])
对于3,从概念上讲,您希望对每一对应用isInside点
。现在它有一个类似于Point->Point->Bool
的类型。您希望得到一个将前两个参数作为元组的函数:(点,点)->Bool
。此函数称为uncurry
,因为相反的转换(将需要一个元组的函数转换为多个参数之一)称为currying。所以你可以写3。像这样:
results = map (uncurry (isInside point)) vertexPairs
虽然蒂肯回答了大多数问题,但如果你想用一种稍微漂亮一点的方式来写,你可以这样做
vertexPairs v=zip v(尾$cycle v)
这是因为
zip
在其中一个参数“用完”时停止生成列表非常清楚的答案,谢谢。我想这是一件好事,毕竟我的解决方案没有那么糟糕:)嗯,我没有想到:)谢谢!哈,我正要发表评论,但是奥利安塔的回复出现了。我有一个类似的建议,但也是轻浮的无点版本vertexPairs=zip-tail。循环
,这可能会让你觉得有趣
vertexPairs = zip vertexes (tail vertexes ++ [head vertexes])
results = map (uncurry (isInside point)) vertexPairs