我阅读了有关 haskell 语言扩展的指南,并且对 TransformListComp 的解释感到有些困惑。我试图在没有糖的情况下重写所有 TransformListComp 表达式,但我不确定我是否正确。
另外我认为指南中有一个错误:“then group using clauses”的示例是不可能的,因为“(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])