列表理解中的"统一"

Jar*_*mex 6 haskell functional-programming list-comprehension

好吧,我正在尝试创建一个函数来确定元组列表是否是可传递的,即如果(x,y)和(y,z)在列表中,那么(x,z)也在列表中.

例如,[(1,2), (2,3), (1,3)]是传递性的.

现在,来自Prolog背景,以下内容对我有意义:

transitive xs = and [elem (x, z) xs | (x, y) <- xs , (y, z) <- xs ]
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用.似乎'y'没有像我预期的那样获得单个值,但是当涉及到第二个元组时,它被'重新分配'.相反,我们必须使用:

transitive xs = and [elem (x, z) xs | (x, y1) <- xs , (y2, z) <- xs, y1 == y2 ]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么第一个例子不会导致错误,这是否违背了函数式编程语言的"引用透明度"原则?

"但是,在纯函数和逻辑语言中,由于引用透明性的要求,变量被绑定到表达式并在其整个生命周期中保持单个值." - 维基百科

谢谢!

Dan*_*her 8

即使在函数式语言中,也存在名称阴影.有时这很有用.在第一个代码中,(y,z) <- xs阴影y受到(x,y) <- xs之前的约束.

编译并打开警告以提醒这些事情.

  • 谢谢你,在你使用"阴影"这个短语后,我发现一个非常相似的问题已经得到了回答.http://stackoverflow.com/questions/4053789/variables-in-haskell.谢谢你的时间 :) (3认同)