首页 > 解决方案 > Opaleye 和 IfPP 中的 leftJoinF

问题描述

我想使用 aLEFT 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,我还能做什么?

标签: haskellopaleye

解决方案


您不能Maybe从功能连接中返回。功能连接允许您避免Nullable从某种意义上说它对IS NULL您隐藏检查。它不允许您将可空性“提升”到 Haskell 方面。


推荐阅读