Haskell “a”中相邻元素对的惰性生成;循环清单“;

Haskell “a”中相邻元素对的惰性生成;循环清单“;,haskell,lazy-evaluation,circular-list,Haskell,Lazy Evaluation,Circular List,要检查光线与三角形的碰撞,我们可以首先查看光线是否与三角形的平面碰撞。如果有,我们检查所有三角形边的交点是否在同一侧。如果为true,则表示该点位于三角形内。此过程类似于矩形和其他凸面图形 这是属于矩形的顶点列表(按逆时针顺序排列): 我想生成一个包含所有方面的列表;即,所有相邻的顶点对: vertexPairs = [(ll, lr), (lr, ur), (ur, ul), (ul, ll)] (请注意,最后一个顶点ul也与第一个顶点ll成对) 假设我有一个顶点的有序列表,我如何才能懒洋洋

要检查光线与三角形的碰撞,我们可以首先查看光线是否与三角形的平面碰撞。如果有,我们检查所有三角形边的交点是否在同一侧。如果为true,则表示该点位于三角形内。此过程类似于矩形和其他凸面图形

这是属于矩形的顶点列表(按逆时针顺序排列):

我想生成一个包含所有方面的列表;即,所有相邻的顶点对:

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)
  • 这是懒惰吗?我会这么说,因为它不使用last或类似的函数,但我对Haskell还是比较陌生的
  • 它看起来也有点难看,多亏了连接和 单元素列表。有更好的办法吗
  • 作为一个相关问题,第3行的自由点符号应该是什么

  • 是的,这种生成列表的方法是懒惰的。通常,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