=== (Is this strict equality operator)?

Hi All,

Going through one of the IOU samples… just wanted to know if, “===” is this some kind of equality operator ? If yes, what is the use of this operator ?

module IouTrade where

import DA.Assert
import Iou

template IouTrade
  with
    buyer : Party
    seller : Party
    baseIouCid : IouCid
    baseIssuer : Party
    baseCurrency : Text
    baseAmount : Decimal
    quoteIssuer : Party
    quoteCurrency : Text
    quoteAmount : Decimal
  where
    signatory buyer
    observer seller

-- BEGIN_IOU_COMPOSITE_CHOICE
    choice IouTrade_Accept : (IouCid, IouCid)
      with
        quoteIouCid : IouCid
      controller seller
      do
        baseIou <- fetch baseIouCid
        baseIssuer === baseIou.issuer
        baseCurrency === baseIou.currency
        baseAmount === baseIou.amount
        buyer === baseIou.owner

        quoteIou <- fetch quoteIouCid
        quoteIssuer === quoteIou.issuer
        quoteCurrency === quoteIou.currency
        quoteAmount === quoteIou.amount
        seller === quoteIou.owner
        
        quoteIouTransferCid <- exercise quoteIouCid Iou_Transfer with
          newOwner = buyer
        transferredQuoteIouCid <- exercise quoteIouTransferCid IouTransfer_Accept
        baseIouTransferCid <- exercise baseIouCid Iou_Transfer with
          newOwner = seller
        transferredBaseIouCid <- exercise baseIouTransferCid IouTransfer_Accept
        return (transferredQuoteIouCid, transferredBaseIouCid)
-- END_IOU_COMPOSITE_CHOICE

    choice TradeProposal_Reject : ()
      controller seller
      do return ()

No, there is no strict equality operator in Daml. == requires that both sides have the same type so it’s not even clear to me what strict equality would check in addition to that in Daml.

In Daml, === is a synonym for assertEq. It checks if the two values are equal using == and if they are not it throws an assertion failure which will abort the transaction.

The definition of === is fairly simple, I recommend to take a look if you’re interested.

2 Likes

Thank you @cocreature

Hello,

Was trying to use assertEq in my choice to check if two date values are equal

But for some reason getting this error:

• Couldn't match expected type ‘Update a0’
                  with actual type ‘(Date, Date) -> m0 ()’
• Probable cause: ‘assertEq’ is applied to too few arguments
      In a stmt of a 'do' block: assertEq (transferDate, nowDate)

What does “expected type ‘Update a0’” mean ?

Any sample code would be helpful.

Thank you!

To pass two arguments to a function you need to use assertEq transferDate nowDate. assertEq (transferDate, nowDate) passes a single argument with that argument being a tuple which doesn’t match the type of assertEq.

The error is telling you that you are in a context where the compiler expects something of type Update a where a is a type variable so there could be different options that typecheck. But what you specified has type (Date, Date) -> m0 () (again m0 is a type variable) which is the type of assertEq (transferDate, nowDate): It expects a second argument of the same type, in your case a tuple, to compare it to.

1 Like

Thank you @cocreature as always helping out with the doubts