在Haskell的parallel list comprehension中,我在尝试使用后卫时遇到了问题。
largestPalindrome :: Int -> Int
largestPalindrome x = maximum [ a*b
| a <- [x,x-1..1]
| b <- [x,x-1..1]
, isPalindrome (a*b) ]
显示的错误是
Variable not in scope: a :: Int
答案 0 :(得分:5)
平行理解用表示法扩展列表理解 拉链。理解
[ e | quals1 | ... | qualsN ]
可以去除
zipWithN (\ p1 ... pN -> e) [p1 | quals1] ... [pN | qualsN]
其中
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) ]
很清楚为什么a
不在最后一个列表理解的范围内。直觉上,您应该将每个|
分隔部分视为完全独立于其他部分。任何过滤操作都将仅绑定到这些部分的一个。