Why does DA.Next.Set not have a map function?

Or have I just not found it yet?

1 Like

Essentially Sets are ordered so you can’t map over them because there’s no guarantee the mapping doesn’t change the order.

You’d probably want to transform your Set into a list with toList first and then map over that.

1 Like

Intuitively, I would’ve considered sets to be an unordered collection. By what are they ordered?

1 Like

Nevermind, my answer was incorrect.

There is fmap https://docs.daml.com/daml/reference/base.html#function-ghc-base-fmap-41707

However DAML stdlib does not have a Functor implemented for DA.Next.Set and this must be after Haskell’s Data.Set type which also does not implement Functor. Quick googling:

1 Like

There are a few different questions here. Let me first answer the original question:

Is there a good reason why DA.Next.Set does not have a map function?

No and imho we should add one.

Is DA.Next.Set ordered?

DA.Next.Set is a wrapper around TextMap () so we have to look at that.
There are two parts to this: First, toList implies an order on the keys. This is guaranteed to be the lexicographic order on Text values. Second, the internal implementation of TextMap is a scala HashMap which is not ordered so the sorting happens when converting to a list.

Does it matter if the internal implementation is sorted or not?

Not really, you can always implement map f as fromList . map f . toList. If your set is sorted and you know that mapping preserves the order you can be a bit more efficient but you can implement map either way and as mentioned above HashMap isn’t sorted anyway.

Can we implement a Functor instance for Set?

No, to insert something into a Set you need a MapKey constraint. However, not all types can have instances of MapKey, in particular, functions are not instances of MapKey. Functor requires you to implement fmap : (a -> b) -> Set a -> Set b but here we can only get map : (MapKey a, MapKey b) -> (a -> b) -> Set a -> Set b.

2 Likes

Can someone give a counter-example for composition? I’m probably being thick but I can’t think of an example off-hand.