haskell-classes/2016-03-07.md

88 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

Day 5
- Homework from day 4
- Higher order programming
- Anonymous functions
```λ> let f = \x y -> x `div` y```
- Function composition
```haskell
λ> let isEvenLengthTree t = even (length (inOrder t))
λ> let compose f g = \x -> f (g x)
λ> :t compose
compose :: (b -> c) -> (a -> b) -> a -> c
λ> let isEvenLengthTree t = (even `compose` length `compose` inOrder) t
λ> :t isEvenLengthTree
isEvenLengthTree :: BST -> Bool
λ> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
λ> let isEvenLengthTree t = (even . length . inOrder) t
λ> :t ($)
($) :: (a -> b) -> a -> b
λ> length $ [1..10]
10
λ> :i ($)
($) :: (a -> b) -> a -> b -- Defined in GHC.Base
infixr 0 $
λ> let isEvenLengthTree t = even . length . inOrder $ t
λ> :t isEvenLengthTree
isEvenLengthTree :: BST -> Bool
```
- Currying
- Partial application
```haskell
λ> let t = fromList [1..10]
λ> :t insert t
insert t :: Int -> BST
λ> let insertIntoT = insert t
λ> t
Node (Node (Node (Node (Node (Node (Node (Node (Node (Node EmptyNode 1 EmptyNode) 2 EmptyNode) 3 EmptyNode) 4 EmptyNode) 5 EmptyNode) 6 EmptyNode) 7 EmptyNode) 8 EmptyNode) 9 EmptyNode) 10 EmptyNode
λ> insertIntoT 30
Node (Node (Node (Node (Node (Node (Node (Node (Node (Node EmptyNode 1 EmptyNode) 2 EmptyNode) 3 EmptyNode) 4 EmptyNode) 5 EmptyNode) 6 EmptyNode) 7 EmptyNode) 8 EmptyNode) 9 EmptyNode) 10 (Node EmptyNode 30 EmptyNode)
λ> insertIntoT (-30)
Node (Node (Node (Node (Node (Node (Node (Node (Node (Node (Node EmptyNode (-30) EmptyNode) 1 EmptyNode) 2 EmptyNode) 3 EmptyNode) 4 EmptyNode) 5 EmptyNode) 6 EmptyNode) 7 EmptyNode) 8 EmptyNode) 9 EmptyNode) 10 EmptyNode
λ> :t insertIntoT
insertIntoT :: Int -> BST
λ> :t uncurry
uncurry :: (a -> b -> c) -> (a, b) -> c
λ> :t uncurry insert
uncurry insert :: (BST, Int) -> BST
λ> :t curry . uncurry $ insert
curry . uncurry $ insert :: BST -> Int -> BST
λ> (find 99 (insert 4 (fromList [1..10])))
False
λ> find 99 . insert 4 . fromList $ [1..10]
False
λ> find 99 $ insert 4 $ fromList $ [1..10]
False
λ> let f = find 99 . insert 4 . fromList
λ> f [1..10]
False
λ> :t flip
flip :: (a -> b -> c) -> b -> a -> c
λ> :t find
find :: Int -> BST -> Bool
λ> :t flip find
flip find :: BST -> Int -> Bool
λ> :m +Data.Function
λ> :t (&)
(&) :: a -> (a -> b) -> b
λ> [1..10] & fromList & insert 4 & find 99
False
λ> let f |> g = \x -> g . f $ x
λ> let f = fromList |> insert 4 |> find 99
λ> :t (|>)
(|>) :: (r -> b) -> (b -> c) -> r -> c
λ> [1..1] & fromList |> insert 4 |> find 99
False
λ> fromList |> insert 4 |> find 99 $ [1..10]
False
λ> fromList |> (find 99 . insert 4) $ [1..10]
False
```
Homework: write these functions
- map :: (a -> b) -> [a] -> [b]
- filter :: (a -> Bool) -> [a] -> [a]
- fold :: (r -> a -> r) -> r -> [a] -> r