rec-def-0.2.2: Recursively defined values
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Recursive.DualBool

Description

The type RDualBool is like Bool, but allows recursive definitions:

>>> :{
  let x = RDB.true
      y = x RDB.&& z
      z = y RDB.|| RDB.false
  in RDB.get x
:}
True

This finds the greatest solution, i.e. prefers True over False:

>>> :{
  let x = x RDB.&& y
      y = y RDB.&& x
  in (RDB.get x, RDB.get y)
:}
(True,True)

Use RBool from Data.Recursive.Bool if you want the least solution.

Synopsis

Documentation

data RDualBool Source #

Like Bool, but admits recursive definitions, preferring the greatest solution.

get :: RDualBool -> Bool Source #

Extracts the value of a RDualBool

mk :: Bool -> RDualBool Source #

RDB.get (RDB.mk b) === b

true :: RDualBool Source #

RDB.get RDB.true == True

false :: RDualBool Source #

RDB.get RDB.false == False

(&&) :: RDualBool -> RDualBool -> RDualBool Source #

RDB.get (r1 RDB.&& r2) === (RDB.get r1 && RDB.get r2)

(||) :: RDualBool -> RDualBool -> RDualBool Source #

RDB.get (r1 RDB.|| r2) === (RDB.get r1 || RDB.get r2)

and :: [RDualBool] -> RDualBool Source #

RDB.get (RDB.and rs) === and (map RDB.get rs)

or :: [RDualBool] -> RDualBool Source #

RDB.get (RDB.or rs) === or (map RDB.get rs)

not :: RBool -> RDualBool Source #

RDB.get (RDB.not r1) === not (RB.get r1)

id :: RDualBool -> RDualBool Source #

The identity function. This is useful when tying the knot, to avoid a loop that bottoms out:

let x = x in RDB.get x

will not work, but

>>> let x = RDB.id x in RDB.get x
True

does.

| prop> RDB.get (RDB.id r) === RDB.get r