PID Controller: A comparison of approaches
And a case for a compositional, denotative, and locally stateful style.
import System.Random | |
import Control.Monad.Random | |
import Control.Monad | |
metroStep :: (RandomGen g) => (Double -> Double) -> Double -> Double -> Rand g Double | |
metroStep p step x = do | |
dx <- getRandomR (-step, step) | |
let | |
newx = x + dx | |
p0 = p x |
{-# LANGUAGE FlexibleContexts #-} | |
{-# LANGUAGE GADTs #-} | |
{-# LANGUAGE QuasiQuotes #-} | |
{-# LANGUAGE TemplateHaskell #-} | |
{-# LANGUAGE TypeFamilies #-} | |
{-# LANGUAGE TypeSynonymInstances #-} | |
{-# LANGUAGE GeneralizedNewtypeDeriving #-} | |
{-# LANGUAGE EmptyDataDecls #-} | |
{-# LANGUAGE OverloadedStrings #-} |
import Data.Maybe (isJust) | |
assert :: Bool -> Maybe () | |
assert True = Just () | |
assert False = Nothing | |
checkAssertions :: Maybe () -> Bool | |
checkAssertions = isJust | |
checkMatch :: Person -> Person -> Bool |
#!/bin/bash | |
SHAKEFILE=${1:-"Shakefile"} | |
if [ ! -e "$SHAKEFILE" ]; then | |
tee -a "$SHAKEFILE" << 'EOF' > /dev/null | |
import Development.Shake | |
opts = shakeOptions { shakeFiles = ".shake/" |
-- test1.hs | |
-- No dead code: compiles to 1.22M executable | |
-- with stripped .o 1320 byes | |
-- .o file md5sum: 35ccd1647c772a5757fba3ae8bfa6542 | |
main :: IO () | |
main = getLine >>= print | |
-- test2.hs | |
-- With dead code: compiles to 1.22M executable |
andThen :: (s -> IO (a, s)) -> (s -> IO (b, s)) -> (s -> IO (b, s)) | |
andThenWith :: (s -> IO (a, s)) -> (a -> (s -> IO (b, s))) -> (s -> IO (b, s)) | |
-- type synonym: | |
-- | |
-- > type MIOS s a = s -> IO (s, a) |
{-# LANGUAGE Arrows #-} | |
{-# LANGUAGE FlexibleContexts #-} | |
{-# LANGUAGE NoMonomorphismRestriction #-} | |
module Main (main) where | |
import Control.Wire | |
import FRP.Netwire.Move | |
import Control.Arrow | |
import Prelude hiding ((.), id, mapM_) |
And a case for a compositional, denotative, and locally stateful style.
{-# LANGUAGE ConstraintKinds #-} | |
{-# LANGUAGE DataKinds #-} | |
{-# LANGUAGE FlexibleContexts #-} | |
{-# LANGUAGE FlexibleInstances #-} | |
{-# LANGUAGE GADTs #-} | |
{-# LANGUAGE KindSignatures #-} | |
{-# LANGUAGE MultiParamTypeClasses #-} | |
{-# LANGUAGE PolyKinds #-} | |
{-# LANGUAGE ScopedTypeVariables #-} | |
{-# LANGUAGE StandaloneDeriving #-} |
I hereby claim:
To claim this, I am signing this object: