Skip to content

Interest in adding Align? #21

Description

@joneshf

How would we feel about adding a class in the spirit of Align? I think we probably want a bit more granularity (akin to Apply and Divide). What about something that parallels the Apply/Applicative and Divide/Divisible classes:

class (Functor f) <= Align f where
  align :: forall a b c. (These a b -> c) -> f a -> f b -> f c

With the laws:

  • Naturality

    align f (map g x) (map h y) = align (f <<< bimap g h) x y
  • Associativity

    associate :: These a (These b c) -> These (These a b) c
    associate = case _ of
      This x -> This (This x)
      That (This x) -> This (That x)
      That (That x) -> That x
      That (Both x y) -> Both (That x) y
    
    map associate (align identity x (align identity y z))
      = align identity (align identity x y) z

    Or, simpler

    aligned :: forall a b f. Align f => f a -> f b -> f (These a b)
    aligned = align identity
    
    map associate (aligned x (aligned y z)) = aligned (aligned x y) z
class (Align f) <= Alignable f where
  nil :: forall a. f a

With the laws

  • Right identity
    align f x nil = map (f <<< This) x
  • Left identity
    align f nil x = map (f <<< That) x

From Alignable, we can derive map as:

map f x = align (f <<< these identity identity const) x nil

The ultimate motivation for this is to define something similar to Crosswalk, so we can do things like:

parities :: Map Parity (List Int)
parities = crosswalk parity (range 1 10)

parity :: Int -> Map Parity Int
parity x
  | x `mod` 2 == 0 = singleton Even x
  | otherwise = singleton Odd x

data Parity
  = Even
  | Odd

derive instance eqParity :: Eq Parity
derive instance ordParity :: Ord Parity

But, I wanted to see if there was interest in Align first, before going further. Also, Crosswalk is such an out-there name. Maybe we can bike shed it before committing to Align/Alignable.

What do we think?

Metadata

Metadata

Assignees

Labels

purs-0.14A reminder to address this issue or merge this PR before we release PureScript v0.14.0

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions