HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulelinear-base-0.4.0Haskell2010

Control.Optics.Linear.Iso

This module provides linear isomorphisms.

An Iso a b s t is equivalent to a (s %1-> a, b %1-> t). In the simple case of an Iso' a s, this is equivalent to inverse functions (s %1-> a, a %1-> s). In the general case an Iso a b s t means if you have the isomorphisms (a %1-> b, b %1-> a) and (s %1-> t, t %1-> 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)
  • 2 types
  • 5 values

Types

2 declarations

Composing optics

1 declaration

Common optics

2 declarations

Using optics

1 declaration

Constructing optics

1 declaration
valueiso :: (s %1 -> a) -> (b %1 -> t) -> Iso s t a b
#