Расширение Haskell TransformListComp
Я прочитал это руководство о расширениях языка haskell и был несколько озадачен объяснением TransformListComp. Я пытался переписать все выражения 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])
1 ответ
Вы могли бы переписать
[ foo | x1 <- xs1
, x2 <- xs2
, then f
, x3 <- xs3 ]
правильнее как
[ foo | (x1, x2) <- f [ (x1, x2) | x1 <- xs1
, x2 <- xs2 ]
, x3 <- xs3 ]
groupBy
Кажется, ошибка исправлена, пример статьи работает.
Еще один полезный источник по этому расширению находится в этой записи блога, также см. Оригинальную статью всестороннего понимания.