2013-03-15 61 views
3

我读了关于haskell语言扩展的this guide,并对TransformListComp解释有些困惑。我试图重写所有没有糖的TransformListComp表达式,但我不确定我是否正确。Haskell TransformListComp扩展

另外,我认为指南中有一个错误:“(groupBy(==))”不是正确的类型(“Eq a”不能使用)

[foo | x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     then f, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ] 

== 
[foo | f x1 <- xs1, 
     f x2 <- xs2, 
     ... 
     f xi <- xsi, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ] 

------------------- 


[foo | x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     then f by exp, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ] 

== 

f (\(x1,x2,...,xi) -> exp) [(x1,x2,...,xi) | 
     x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi] 

>>=(\(x1,x2,...,xi) -> 
    [foo | 
     xj <- xsj, 
     ... 
     xn <- xni 
    ]) 


------------------- 

[foo | x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     then group using f, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ] 

== 

map unzipI (f [(x1,x2,...,xi) | 
     x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi]) 

>>=(\(xs1,xs2,...,xsi) -> 
    [foo | 
     x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ]) 

unzipI :: [(t1,t2,...tn)] -> ([t1],[t2]..,[tn]) 

------------------- 

[foo | x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     then group by exp using f, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ] 

== 

map unzipI (f (\(x1,x2,...,xi) -> exp) [(x1,x2,...,xi) | 
     x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi]) 

>>=(\(xs1,xs2,...,xsi) -> 
    [foo | 
     x1 <- xs1, 
     x2 <- xs2, 
     ... 
     xi <- xsi, 
     xj <- xsj, 
     ... 
     xn <- xni 
    ]) 

unzipI :: [(t1,t2,...tn)] -> ([t1],[t2]..,[tn]) 

回答

0

你可以更正确地改写

[ foo | x1 <- xs1 
     , x2 <- xs2 
     , then f 
     , x3 <- xs3 ] 

[ foo | (x1, x2) <- f [ (x1, x2) | x1 <- xs1 
           , x2 <- xs2 ] 
     , x3 <- xs3 ] 

的在此期间3210错误似乎已被修复,文章的例子起作用。

此扩展的另一个有用的来源是在这blog post,也见原始文章comprehensive comprehensions