| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
Data.Function.Step
Synopsis
- data SF k v = SF !(Map (Bound k) v) !v
- data Bound k
- constant :: a -> SF k a
- step :: k -> v -> v -> SF k v
- fromList :: Ord k => [(Bound k, v)] -> v -> SF k v
- normalise :: Eq v => SF k v -> SF k v
- (!) :: Ord k => SF k v -> k -> v
- values :: SF k v -> [v]
- showSF :: (Show a, Show b) => SF a b -> String
- putSF :: (Show a, Show b) => SF a b -> IO ()
Step Function
>>>import Test.QuickCheck (applyFun2)>>>import Test.QuickCheck.Poly (A, B, C)>>>import Control.Applicative (liftA2, pure)>>>import Data.Semigroup (Semigroup (..))
Examples
>>>let heaviside = step 0 (-1) 1 :: SF Int Int>>>putSF heaviside\x -> if | x < 0 -> -1 | otherwise -> 1
>>>map (heaviside !) [-3, 0, 4][-1,1,1]
Step function. Piecewise constant function, having finitely many pieces. See https://en.wikipedia.org/wiki/Step_function.
describes a piecewise constant function \(f : k \to v\):SF (fromList [(Open k1, v1), (Closed k2, v2)]) v3 :: SF k v
\[ f\,x = \begin{cases} v_1, \quad x < k_1 \newline v_2, \quad k_1 \le x \le k_2 \newline v_3, \quad k_2 < x \end{cases} \]
or as you would write in Haskell
f x | x < k1 = v1
| x <= k2 = v2
| otherwise = v3
Note: total-map package, which provides function with finite support.
Constructor is exposed as you cannot construct non-valid SF.
Merging
You can use Applicative instance to merge SF.
>>>putSF $ liftA2 (+) (step 0 0 1) (step 1 0 1)\x -> if | x < 0 -> 0 | x < 1 -> 1 | otherwise -> 2
Following property holds, i.e. SF and ordinary function Applicative instances
are compatible (and ! is a homomorphism).
liftA2 (applyFun2 f) g h ! x == liftA2 (applyFun2 f :: A -> B -> C) (g !) (h !) (x :: Int)
Recall that for ordinary functions .liftA2 f g h x = f (g x) (h x)
Dense?
This dense variant is useful with dense ordered domains, e.g. Rational.
Integer is not dense, so you could use Data.Function.Step.Discrete variant instead.
>>>let s = fromList [(Open 0, -1),(Closed 0, 0)] 1 :: SF Rational Int>>>putSF s\x -> if | x < 0 % 1 -> -1 | x <= 0 % 1 -> 0 | otherwise -> 1
>>>import Data.Ratio ((%))>>>map (s !) [-1, -0.5, 0, 0.5, 1][-1,-1,0,1,1]
Instances
| Show2 SF Source # | |
| Foldable (SF k) Source # | |
Defined in Data.Function.Step Methods fold :: Monoid m => SF k m -> m # foldMap :: Monoid m => (a -> m) -> SF k a -> m # foldMap' :: Monoid m => (a -> m) -> SF k a -> m # foldr :: (a -> b -> b) -> b -> SF k a -> b # foldr' :: (a -> b -> b) -> b -> SF k a -> b # foldl :: (b -> a -> b) -> b -> SF k a -> b # foldl' :: (b -> a -> b) -> b -> SF k a -> b # foldr1 :: (a -> a -> a) -> SF k a -> a # foldl1 :: (a -> a -> a) -> SF k a -> a # elem :: Eq a => a -> SF k a -> Bool # maximum :: Ord a => SF k a -> a # | |
| Show k => Show1 (SF k) Source # | |
| Traversable (SF k) Source # | |
| Ord k => Applicative (SF k) Source # |
|
| Functor (SF k) Source # | |
| Ord k => Monad (SF k) Source # | |
| (Ord k, Arbitrary k, Arbitrary v) => Arbitrary (SF k v) Source # | |
| (Ord k, Monoid v) => Monoid (SF k v) Source # | |
| (Ord k, Semigroup v) => Semigroup (SF k v) Source # | Piecewise
|
| (Show k, Show v) => Show (SF k v) Source # | |
| (NFData k, NFData v) => NFData (SF k v) Source # | |
Defined in Data.Function.Step | |
| (Eq k, Eq v) => Eq (SF k v) Source # | |
| (Ord k, Ord v) => Ord (SF k v) Source # | |
Bound operations
Instances
| Foldable Bound Source # | |
Defined in Data.Function.Step Methods fold :: Monoid m => Bound m -> m # foldMap :: Monoid m => (a -> m) -> Bound a -> m # foldMap' :: Monoid m => (a -> m) -> Bound a -> m # foldr :: (a -> b -> b) -> b -> Bound a -> b # foldr' :: (a -> b -> b) -> b -> Bound a -> b # foldl :: (b -> a -> b) -> b -> Bound a -> b # foldl' :: (b -> a -> b) -> b -> Bound a -> b # foldr1 :: (a -> a -> a) -> Bound a -> a # foldl1 :: (a -> a -> a) -> Bound a -> a # elem :: Eq a => a -> Bound a -> Bool # maximum :: Ord a => Bound a -> a # minimum :: Ord a => Bound a -> a # | |
| Show1 Bound Source # | |
| Traversable Bound Source # | |
| Functor Bound Source # | |
| Arbitrary k => Arbitrary (Bound k) Source # | |
| Show k => Show (Bound k) Source # | |
| NFData k => NFData (Bound k) Source # | |
Defined in Data.Function.Step | |
| Eq k => Eq (Bound k) Source # | |
| Ord k => Ord (Bound k) Source # | |
Construction
step :: k -> v -> v -> SF k v Source #
Step function.
.step k v1 v2 = \ x -> if x < k then v1 else v2
>>>putSF $ step 1 2 3\x -> if | x < 1 -> 2 | otherwise -> 3
fromList :: Ord k => [(Bound k, v)] -> v -> SF k v Source #
Create function from list of cases and default value.
>>>let f = fromList [(Open 1,2),(Closed 3,4),(Open 4,5)] 6>>>putSF f\x -> if | x < 1 -> 2 | x <= 3 -> 4 | x < 4 -> 5 | otherwise -> 6
>>>map (f !) [0..10][2,4,4,4,6,6,6,6,6,6,6]