lab04b: init
This commit is contained in:
77
lab04/ho.hs
Normal file
77
lab04/ho.hs
Normal file
@@ -0,0 +1,77 @@
|
||||
import qualified Data.Map as Map
|
||||
|
||||
m = Map.empty
|
||||
m' = Map.insert 3 "hello" m
|
||||
s = case (Map.lookup 3 m') of
|
||||
Just s' -> s'
|
||||
Nothing -> error "not found"
|
||||
|
||||
|
||||
addNums x y = x + y
|
||||
|
||||
inc :: Int -> Int
|
||||
inc = addNums 1
|
||||
|
||||
incList :: [Int] -> [Int]
|
||||
incList [] = []
|
||||
incList (x:xs) = inc x : (incList xs)
|
||||
|
||||
decList :: [Int] -> [Int]
|
||||
decList [] = []
|
||||
decList (x:xs) = (x-1) : (decList xs)
|
||||
|
||||
|
||||
applyFun2List :: (a->b) -> [a] -> [b]
|
||||
applyFun2List _ [] = []
|
||||
applyFun2List f (x:xs) = (f x) : (applyFun2List f xs)
|
||||
|
||||
incList' = applyFun2List inc
|
||||
--incList' = map inc
|
||||
|
||||
|
||||
removeNegatives :: [Integer] -> [Integer]
|
||||
removeNegatives [] = []
|
||||
removeNegatives (x:xs) =
|
||||
let rest = removeNegatives xs in
|
||||
if x >= 0 then
|
||||
x : rest
|
||||
else
|
||||
rest
|
||||
|
||||
--filter
|
||||
removeBadElems :: (a -> Bool) -> [a] -> [a]
|
||||
removeBadElems _ [] = []
|
||||
removeBadElems pred (x:xs) =
|
||||
let rest = removeBadElems pred xs in
|
||||
if pred x then
|
||||
x : rest
|
||||
else
|
||||
rest
|
||||
|
||||
|
||||
|
||||
addListOfNums :: Num a => a -> [a] -> a
|
||||
addListOfNums accum [] = accum
|
||||
addListOfNums accum (x:xs) = addListOfNums (accum + x) xs
|
||||
|
||||
decListOfNums :: Num a => a -> [a] -> a
|
||||
decListOfNums accum [] = accum
|
||||
decListOfNums accum (x:xs) = addListOfNums (accum - x) xs
|
||||
|
||||
addListOfNumStrings :: Int -> [String] -> Int
|
||||
addListOfNumStrings accum [] = accum
|
||||
addListOfNumStrings accum (s:xs) = addListOfNumStrings (accum + (read s)) xs
|
||||
|
||||
|
||||
--foldl
|
||||
foldTogether :: (a -> b -> a) -> a -> [b] -> a
|
||||
foldTogether _ accum [] = accum
|
||||
foldTogether f accum (x:xs) = foldTogether f (f accum x) xs
|
||||
|
||||
addListOfNums' :: Num a => [a] -> a
|
||||
addListOfNums' = foldTogether (+) 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
46
lab04/lab.lhs
Normal file
46
lab04/lab.lhs
Normal file
@@ -0,0 +1,46 @@
|
||||
> import Data.List
|
||||
|
||||
Experiment with foldl, foldr, and foldl'
|
||||
|
||||
First, implement your own version of the foldl function,
|
||||
defined as myFoldl
|
||||
|
||||
> myFoldl :: (a -> b -> a) -> a -> [b] -> a
|
||||
> myFoldl _ _ _ = error "TBD"
|
||||
|
||||
|
||||
Next, define a function to reverse a list using foldl.
|
||||
|
||||
> myReverse :: [a] -> [a]
|
||||
> myReverse _ = error "TBD"
|
||||
|
||||
|
||||
Now define your own version of foldr, named myFoldr
|
||||
|
||||
> myFoldr :: (a -> b -> b) -> b -> [a] -> b
|
||||
> myFoldr _ _ _ = error "TBD"
|
||||
|
||||
|
||||
Now try using foldl (the library version, not yours) to sum up the numbers of a large list.
|
||||
Why is it so slow?
|
||||
|
||||
Instead of foldl, try using foldl'.
|
||||
Why is it faster?
|
||||
(Read http://www.haskell.org/haskellwiki/Foldr_Foldl_Foldl%27 for some hints)
|
||||
|
||||
|
||||
For an extra challenge, try to implement foldl in terms of foldr.
|
||||
See http://www.haskell.org/haskellwiki/Foldl_as_foldr for details.
|
||||
|
||||
|
||||
Next, using the map function, convert every item in a list to its absolute value
|
||||
|
||||
> listAbs :: [Integer] -> [Integer]
|
||||
> listAbs _ = error "TBD"
|
||||
|
||||
Finally, write a function that takes a list of Integers and returns the sum of
|
||||
their absolute values.
|
||||
|
||||
> sumAbs :: [Integer] -> Integer
|
||||
> sumAbs _ = error "TBD"
|
||||
|
||||
BIN
lab04/mapFilter.signed.zip
Normal file
BIN
lab04/mapFilter.signed.zip
Normal file
Binary file not shown.
9
lab04/perhaps.hs
Normal file
9
lab04/perhaps.hs
Normal file
@@ -0,0 +1,9 @@
|
||||
data Perhaps a =
|
||||
PerhapsSo a
|
||||
| PerhapsNot
|
||||
deriving Show
|
||||
|
||||
instance Functor Perhaps where
|
||||
fmap f (PerhapsSo x) = PerhapsSo (f x)
|
||||
fmap f PerhapsNot = PerhapsNot
|
||||
|
||||
14
lab04/tailRecursion.hs
Normal file
14
lab04/tailRecursion.hs
Normal file
@@ -0,0 +1,14 @@
|
||||
fact :: Integer -> Integer
|
||||
fact 1 = 1
|
||||
fact n = n * (fact $ n - 1)
|
||||
|
||||
|
||||
fact' :: Integer -> Integer -> Integer
|
||||
fact' 0 acc = acc
|
||||
fact' n acc = fact' (n - 1) (n * acc)
|
||||
|
||||
fact2 :: Integer -> Integer -> Integer
|
||||
fact2 n acc = if n == 0
|
||||
then acc
|
||||
else fact2 (n - 1) (n * acc)
|
||||
|
||||
36
lab04/tree.hs
Normal file
36
lab04/tree.hs
Normal file
@@ -0,0 +1,36 @@
|
||||
--This works, but it is not generic
|
||||
data TreeStringInt =
|
||||
EmptyTSI
|
||||
| NodeTSI String Int TreeStringInt TreeStringInt
|
||||
deriving (Show)
|
||||
|
||||
findTsi :: String -> TreeStringInt -> Maybe Int
|
||||
findTsi _ EmptyTSI = Nothing
|
||||
findTsi s (NodeTSI key i left right) =
|
||||
if key == s then
|
||||
Just i
|
||||
else if s < key then
|
||||
findTsi s left
|
||||
else
|
||||
findTsi s right
|
||||
|
||||
|
||||
|
||||
--Using type parameters, we can create a BST in a more generic form
|
||||
data Tree k v =
|
||||
Empty
|
||||
| Node k v (Tree k v) (Tree k v)
|
||||
deriving (Show)
|
||||
|
||||
--findT :: k -> Tree k v -> Maybe v
|
||||
findT :: Ord k => k -> Tree k v -> Maybe v
|
||||
findT _ Empty = Nothing
|
||||
findT s (Node key val left right) =
|
||||
if key == s then
|
||||
Just val
|
||||
else if s < key then
|
||||
findT s left
|
||||
else
|
||||
findT s right
|
||||
|
||||
|
||||
Reference in New Issue
Block a user