leftJoinF в Opaleye и IfPP
Я хочу использовать LEFT JOIN
получить продукты и их (необязательные) атрибуты. У меня есть такие типы, как:
type ProductPGR = ProductPoly (Column (PGID Product)) (Column PGText)
type ProductAttributePGR = ProductAttributePoly (Column (PGID ProductAttribute)) (Column (PGID Product)) (Column PGInt4)
Мое намерение было использовать:
(p :: ProductPGR, pa :: Maybe ProductAttributePGR) <- leftJoinF
(\p' pa' -> (p', Just pa'))
(\p' -> (p', Nothing))
(\p' pa' -> productId p' .== paProductId pa')
productQuery
productAttributeQuery -< ()
Это не компилируется, потому что:
No instance for (Default
IfPP
(Maybe
(ProductAttributePoly
(Column (PGID ProductAttribute))
(Column (PGID Product))
(Column PGInt4))))
(Maybe
(ProductAttributePoly
(Column (PGID ProductAttribute))
(Column (PGID Product))
(Column PGInt4))))
arising from a use of ‘leftJoinF’
Я действительно должен определить этот экземпляр? Для чего это нужно и как мне это сделать?
Или если я не должен использовать Maybe
что бы я еще делал?
1 ответ
Решение
Вы не можете вернуть Maybe
вне функционального соединения. Функциональное соединение позволяет избежать Nullable
в том смысле, что он скрывает IS NULL
чек от вас. Это не позволяет вам "поднять обнуляемость" на сторону Haskell.