3

外部結合が esqueleto でどのように機能するかについて少し混乱しています。

次のクエリを作成しました(簡略化):

select $ from $ \(rep `LeftOuterJoin` event) -> do
          on (rep ^. RepAtomId  ==. event   ^. EventAtomId )
          where_ (rep ^. RepAtomId  ==. val aid)
          return $ (rep, event ^. EventSeconds)

私の知る限り、SQL 側では、このクエリは関連するイベントを持つ可能性のある担当者を検索します。イベントが関連付けられていない場合、イベント フィールド (EventSeconds など) は「null」になります。Haskell 側では、これらを Maybe Seconds に変換する必要があります (まあ、int ですが、おわかりでしょう)。

では、このクエリを実行すると、rep リレーションに隣接するものが何もない場合、実際にはどうなるでしょうか? デフォルトを貼り付けるためにタプルを分解するにはどうすればよいですか?

現在、次のようなものがあります。

case listToMaybe lrep of
  Just ( entityVal -> rep
       , unValue -> seconds
       ) -> do stuff

(ここで ViewPatterns をオンにしていることに注意してください)。このタイプはチェックします。しかし、 (?.) と (fromMaybe 360​​0) を使用すると失敗します。パターン分析で unValue。

4

1 に答える 1

3

適切な場所に「just」を追加することで、これを修正できました。

select $ from $ \(rep `LeftOuterJoin` event) -> do
         on (just (rep ^. RepAtomId)  ==. event  ?. EventAtomId )
         where_ (rep ^. RepAtomId  ==. val aid)
         return $ (rep, event ?. EventSeconds)

case listToMaybe lrep of
  Just ( entityVal -> rep
       , (fromMaybe 3600) . unValue -> seconds
       ) -> do stuff

(イベント)にはMaybeのようなタイプがあるという考えです(そのタイプが何であるかはわかりませんが、Maybeが埋め込まれていることは知っています)。だから私が担当者と比較していたとき、私はa(おそらくa)とaを比較していました. 'just' は、中間型を分解することなく、a を a (多分 a) にラップしました。

于 2014-05-31T07:55:55.993 に答える