260 likes | 637 Views
Haskell. programming language. Haskell is…. Memory managed (allocation, collection) “Typeful” (static, strong) Types are checked at compile-time Types cannot be coerced (in general) Pure functional programming Emphasis on functions Referential transparency All variables are constant.
E N D
Haskell programming language
Haskell is… • Memory managed (allocation, collection) • “Typeful” (static, strong) • Types are checked at compile-time • Types cannot be coerced (in general) • Pure functional programming • Emphasis on functions • Referential transparency • All variables are constant
Haskell - pros & cons • Concurrency • The #1 on Language Shootout for threading • All non-I/O code is concurrent by default • (mutations are handled as I/O code) • Readability • No parentheses or commas • Higher-order functions reduce lines-of-code • (no syntax as a reminder of context)
Main main True a Bool Eq -- modules (packages) -- value variables (functions) -- value constructors -- type variables (generics) -- type constructors -- type classes (interfaces) Haskell - namespaces
Derived syntax f x = expr (x *) (* y) (*) x `times` y f $ g $ h x (f . g . h) x do a; b; c -- lambda -- sections -- sections -- sections -- infix func -- parens -- compose -- I/O bind Haskell - syntax Core syntax f = \x -> expr \y -> x * y \x -> x * y \x y -> x * y times x y f (g (h x)) f (g (h x)) a >>= b >>= c
Haskell - type syntax life = 42 :: Int life :: Int life = 42
Haskell - types “Hello” :: String length :: [a] -> Int floor :: Float -> Int map :: (a -> b) -> [a] -> [b] 42 :: Int (+) :: Int -> Int -> Int 42 :: Num a => a (+) :: Num a => a -> a -> a
Int, Word, Float, Double, Char type String = [Char] data Maybe a = Nothing | Just a class Eq a where (==), (/=) :: a -> a -> Bool instance Eq Bool where True == True = True False == False = True _ == _ = False -- built-in types -- type synonyms -- data types -- type classes -- type class instances Haskell - type system
data Bool = False | True data Tree a = Leaf a | Branch (Tree a) (Tree a) data Rect = Rect Int Int Int Int data Rect = Rect { x, y :: Int, width :: Int, height :: Int} -- enumerations -- generics -- unlabeled record -- labeled record Haskell - datatypes
main = return () main = putStrLn “Hello World” main = interact id main = interact (unlines . reverse . lines) main = do args <- getArgs case args of "-n":a -> putStr (unwords a) a -> putStrLn (unwords a) -- null program -- hello world -- UNIX cat -- GNU tac -- UNIX echo Haskell - example programs
Darcs - overview • The Theory of Patches • A “branch” is a set of patches • “Spontaneous branches” • Every checkout is a branch • Every checkout is a repository
Darcs - interactive • Interactive “pull” • You chose what patches to download • Interactive “push” • You chose what patches to commit externally • Interactive “record” • You chose what files to commit locally
Parsec parser library
many :: Parser a -> Parser [a] many1 :: Parser a -> Parser [a] optional :: Parser a -> Parser (Maybe a) sepBy :: Parser a -> Parser s -> Parser [a] sepBy1 :: Parser a -> Parser s -> Parser [a] endBy :: Parser a -> Parser s -> Parser [a] endBy1 :: Parser a -> Parser s -> Parser [a] char :: Char -> Parser Char between :: Parser open -> Parser close -> Parser a -> Parser a -- like regex* -- like regex+ -- like regex? -- ... , ... , ... -- ... ; ... ; ... ; -- c -- < ... > Parsec - combinators
Parsec - example parsers number = many digit string = between (char ‘"’) (char ‘"’) (many anyChar) lisp = number <|> string <|> identifier <|> parens $ many $ lexeme lisp
xmonad X11 window manager
XMonad - overview • Tilling window manager (like Ratpoison) • Libraries of extensions and status bars • Customizable (config file is the app) • Full keyboard accessibility
XMonad - example config module Main where import XMonad import System.Exit import qualified XMonad.StackSet as W import qualified Data.Map as M myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ [ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf), ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))] myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $ [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w)), ((modMask, button2), (\w -> focus w >> windows W.swapMaster)), ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))] defaults = defaultConfig { keys = myKeys, mouseBindings = myMouseBindings, terminal = "xterm"} main = xmonad defaults
Yi extensible text editor
Yi - overview • Extensible • Fully dynamic application (hs-plugins) • All state is serialized and reloaded • Customizable • yi --as=vim (for vim key bindings) • yi --as=emacs (for emacs key bindings)
Yi - structure Taken from <http://www.cse.unsw.edu.au/~dons/papers/SC05.html>
Haskell Thank You