Îõ³h, ¢ Ù%      !"#$0.2None()*01ÂÄÅÆËÍÎÝìð ‚ data-elevator Similar to %Þ, this type class models a subkinding relationship between two types. The instances lift the Unlifted <: Lifted sub-kinding relationship to &, ,  and then over function types. Like for %Ì, the instances of this type class should ultimately be compiler-generated. data-elevator0Turn an unlifted boxed type into a lifted one. Lazy a5 then enjoys a call-by-name calling convention. E.g., Çlet f :: a -> Int f _ = 42 in f (Lazy (error "boom" :: Array# Int))Will evaluate to 42 and not error. data-elevatoròTurn a lifted data type into an unlifted one. Unlifted data types enjoy a call-by-value calling convention. E.g., Ôlet f :: (a :: UnliftedType) -> Int f _ = 42 in f (Strict (error "boom" :: Int))Will error out with "boom".ÏNote however that most function definitions don't take argument types of kind . Use  to work around that.  data-elevator-The kind of boxed, lifted types, for example [Int]& or any other user-defined data type. data-elevator?Re-use existing code taking arguments lazily to take arguments ly by coercing with  .Example: ' can be re-used on  Strict Int:?levCoerce @(Int -> Bool) @(Strict Int -> Bool) even (Strict 42)True!More generally, any type of kind % can act as a ("is-a") type of kind  -. This levity polymorphism subkinding axiom Unlifted <: Lifted is encoded in ( and is lifted to useful instances for ,  and (->).. Example with covariance in the result type:ÙlevCoerce @(Int -> Strict Bool) @(Strict Int -> Bool) (\x -> Strict (even x)) (Strict 42)TrueA function from Int to  Strict Bool can be called on a  Strict IntÉ (e.g., the precondition strengthened) and the result can be coerced to Bool% (e.g., the postcondition weakened).ðYou can also keep on coercing in negative position of the function arrow, with the variance following polarity: ŠlevCoerce @((Strict Int -> Int) -> Int) @((Int -> Strict Int) -> Int) (\f -> f (Strict 42)) (\x -> Strict x)       None À      (        !"#$%&'()*+,-./(data-elevator-0.2-40HU886OvXfGmloOn8xQXP Data.ElevatorData.Elevator.Internal data-elevatorghc-prim GHC.Types UnliftedTypeLevitySubsumption levCoerce#LazyLazy_StrictStrict_LU LiftedType toStrict# fromStrict#toLazy# fromLazy# levCoerce%$fLevitySubsumptionLiftedLiftedFUNFUN&$fLevitySubsumptionLiftedLiftedFUNFUN0&$fLevitySubsumptionLiftedLiftedFUNFUN1&$fLevitySubsumptionLiftedLiftedFUNFUN2&$fLevitySubsumptionLiftedLiftedFUNFUN3&$fLevitySubsumptionLiftedLiftedFUNFUN4&$fLevitySubsumptionLiftedLiftedFUNFUN5&$fLevitySubsumptionLiftedLiftedFUNFUN6&$fLevitySubsumptionLiftedLiftedFUNFUN7&$fLevitySubsumptionLiftedLiftedFUNFUN8&$fLevitySubsumptionLiftedLiftedFUNFUN9'$fLevitySubsumptionLiftedLiftedFUNFUN10'$fLevitySubsumptionLiftedLiftedFUNFUN11'$fLevitySubsumptionLiftedLiftedFUNFUN12'$fLevitySubsumptionLiftedLiftedFUNFUN13'$fLevitySubsumptionLiftedLiftedFUNFUN14&$fLevitySubsumptionUnliftedLiftedaLazy($fLevitySubsumptionUnliftedLiftedStricta%$fLevitySubsumptionUnliftedUnliftedaa!$fLevitySubsumptionLiftedLiftedaa CoercibleGHC.PrimTYPEbaseGHC.Realeven