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

时间:2016-12-25 05:49:32

标签: haskell list-comprehension

在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

1 个答案:

答案 0 :(得分:5)

引自Haskell Prime

  

平行理解用表示法扩展列表理解   拉链。理解

[ 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不在最后一个列表理解的范围内。直觉上,您应该将每个|分隔部分视为完全独立于其他部分。任何过滤操作都将仅绑定到这些部分的一个