{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE CPP #-} -- | ConstraintKind synonym for marking partial functions module Partial(Partial) where -- Originally taken from the @safe@ package -- GHC has changed its opinion on the location a few times -- v0: GHC 7.4.1, has ConstraintKinds -- v1: GHC 7.10.2, base 4.8.1.0 = CallStack -- v2: GHC 8.0.1, base 4.9.0.0 = HasCallStack -- We never support GHC 7.10.2 style because that requires users to pass the FlexibleContexts -- extension #if __GLASGOW_HASKELL__ >= 800 import GHC.Stack #else import GHC.Exts #endif -- | A constraint which documents that a function is partial, and on GHC 8.0 -- and above produces a stack trace on failure. For example: -- -- @ -- myHead :: 'Partial' => [a] -> a -- myHead [] = error \"bad\" -- myHead (x:xs) = x -- @ -- -- When using 'Partial' with GHC 7.8 or below you need to enable the -- language feature @ConstraintKinds@, e.g. @{-\# LANGUAGE ConstraintKinds \#-}@ -- at the top of the file. #if __GLASGOW_HASKELL__ >= 800 type Partial = HasCallStack #else type Partial = (() :: Constraint) #endif