Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
This module provides linear isomorphisms.
An Iso a b s t
is equivalent to a (s #-> a, b #-> t)
. In the simple
case of an Iso' a s
, this is equivalent to inverse functions
(s #-> a, a #-> s)
. In the general case an Iso a b s t
means if you
have the isomorphisms (a #-> b, b #-> a)
and (s #-> t, t #-> s)
, then
you can form isomorphisms between s
, t
, a
and b
.
Example
{-# LANGUAGE LinearTypes #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE GADTs #-} import Control.Optics.Linear.Internal import Prelude.Linear import qualified Data.Functor.Linear as Data -- A toy example of operating over two isomorphic linear types closureFmap :: (a %1-> b) -> ClosureEither x a %1-> ClosureEither x b closureFmap f = over isoEithers (Data.fmap f) data ClosureEither a b where CLeft :: x %1-> (x %1-> a) %1-> ClosureEither a b CRight :: x %1-> (x %1-> b) %1-> ClosureEither a b isoEithers :: Iso (ClosureEither a b) (ClosureEither a b') (Either a b) (Either a b') isoEithers = iso fromClosure fromEither where fromEither :: Either a b %1-> ClosureEither a b fromEither (Left a) = CLeft () (() -> a) fromEither (Right b) = CRight () (() -> b) fromClosure :: ClosureEither a b %1-> Either a b fromClosure (CLeft x f) = Left (f x) fromClosure (CRight x f) = Right (f x)
Synopsis
- type Iso s t a b = Optic Profunctor s t a b
- type Iso' s a = Iso s s a a
- (.>) :: Optic_ arr s t a b -> Optic_ arr a b x y -> Optic_ arr s t x y
- swap :: SymmetricMonoidal m u => Iso (a `m` b) (c `m` d) (b `m` a) (d `m` c)
- assoc :: SymmetricMonoidal m u => Iso (a `m` (b `m` c)) (d `m` (e `m` f)) ((a `m` b) `m` c) ((d `m` e) `m` f)
- withIso :: Optic_ (Exchange a b) s t a b -> ((s %1 -> a) -> (b %1 -> t) -> r) -> r
- iso :: (s %1 -> a) -> (b %1 -> t) -> Iso s t a b
Types
type Iso s t a b = Optic Profunctor s t a b Source #
Composing optics
Common optics
swap :: SymmetricMonoidal m u => Iso (a `m` b) (c `m` d) (b `m` a) (d `m` c) Source #
assoc :: SymmetricMonoidal m u => Iso (a `m` (b `m` c)) (d `m` (e `m` f)) ((a `m` b) `m` c) ((d `m` e) `m` f) Source #