在Haskell中使用并行列表推导中的变量

Zul*_*dur 3 haskell list-comprehension

在Haskell中的并行列表理解中,我在尝试使用防护时遇到了问题.

largestPalindrome :: Int -> Int
largestPalindrome x = maximum [ a*b
                              | a <- [x,x-1..1]
                              | b <- [x,x-1..1]
                              , isPalindrome (a*b) ]
Run Code Online (Sandbox Code Playgroud)

显示的错误是

Variable not in scope: a :: Int
Run Code Online (Sandbox Code Playgroud)

Ale*_*lec 5

引自Haskell Prime:

并行理解使用拉链表示法扩展列表理解.理解力

[ e | quals1 | ... | qualsN ]
Run Code Online (Sandbox Code Playgroud)

可以贬低

zipWithN (\ p1 ... pN -> e) [p1 | quals1] ... [pN | qualsN]
Run Code Online (Sandbox Code Playgroud)

where pi 是由...定义qualsi和使用的变量的元组e.

所以,从你的例子来看,[a*b |a<- [x,x-1..1] | b <- [x,x-1..1] , isPalindrome (a*b)]大致相当于

zipWith (\a b -> a*b)
        [ a | a<-[x,x-1..1] ]
        [ b | b <- [x,x-1..1], isPalindrome (a*b) ]
Run Code Online (Sandbox Code Playgroud)

很清楚为什么a不在最后一个列表理解的范围内.直觉上,您应该将每个|定界部分视为完全独立于其他部分.任何滤波操作将要被绑定到唯一一个这些零件.