Partially complete the "Basic Libraries" chapter exercises
I was instructed to benchmark these functions, but I couldn't get the benchmarking library to run using Nix -- although I'm *sure* it's possible. Unfortunately the book recommends using `stack`, which I couldn't reproduce.
This commit is contained in:
		
							parent
							
								
									feb74b3091
								
							
						
					
					
						commit
						0f1146cc4c
					
				
					 1 changed files with 60 additions and 0 deletions
				
			
		|  | @ -0,0 +1,60 @@ | ||||||
|  | module BasicLibrariesScratch where | ||||||
|  | 
 | ||||||
|  | import Data.Function ((&)) | ||||||
|  | 
 | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | newtype DList a = DL { unDL :: [a] -> [a] } | ||||||
|  | 
 | ||||||
|  | instance (Show a) => Show (DList a) where | ||||||
|  |   show (DL x) = "DL " ++ show (x []) | ||||||
|  | 
 | ||||||
|  | -- | Create an empty difference list. | ||||||
|  | emptyDList :: DList a | ||||||
|  | emptyDList = DL $ \xs -> xs | ||||||
|  | {-# INLINE emptyDList #-} | ||||||
|  | 
 | ||||||
|  | -- | Create a difference list with `x` as the only member. | ||||||
|  | singleton :: a -> DList a | ||||||
|  | singleton x =  DL $ \xs -> x : xs | ||||||
|  | {-# INLINE singleton #-} | ||||||
|  | 
 | ||||||
|  | -- | Convert the DList into a list. | ||||||
|  | toList :: DList a -> [a] | ||||||
|  | toList (DL unDL) = unDL mempty | ||||||
|  | {-# INLINE toList #-} | ||||||
|  | 
 | ||||||
|  | -- | Add an element to the end of a DList. | ||||||
|  | infixr `snoc` | ||||||
|  | snoc :: a -> DList a -> DList a | ||||||
|  | snoc x (DL xs) = DL $ \ys -> xs (x : ys) | ||||||
|  | {-# INLINE snoc #-} | ||||||
|  | 
 | ||||||
|  | -- | Add an element to the beginning of a DList. | ||||||
|  | infixr `cons` | ||||||
|  | cons :: a -> DList a -> DList a | ||||||
|  | cons x (DL xs) = DL $ \ys -> x : xs ys | ||||||
|  | {-# INLINE cons #-} | ||||||
|  | 
 | ||||||
|  | -- | Combine two DLists together. | ||||||
|  | append :: DList a -> DList a -> DList a | ||||||
|  | append (DL xs) (DL ys) = DL $ \zs -> zs & ys & xs | ||||||
|  | {-# INLINE append #-} | ||||||
|  | 
 | ||||||
|  | -------------------------------------------------------------------------------- | ||||||
|  | data Queue a = | ||||||
|  |   Queue { one :: [a] | ||||||
|  |         , two :: [a] | ||||||
|  |         } deriving (Show, Eq) | ||||||
|  | 
 | ||||||
|  | emptyQueue :: Queue a | ||||||
|  | emptyQueue = Queue mempty mempty | ||||||
|  | 
 | ||||||
|  | enqueue :: a -> Queue a -> Queue a | ||||||
|  | enqueue x (Queue en de) = Queue (x:en) de | ||||||
|  | 
 | ||||||
|  | dequeue :: Queue a -> Maybe (a, Queue a) | ||||||
|  | dequeue (Queue [] []) = Nothing | ||||||
|  | dequeue (Queue en []) = | ||||||
|  |   let (d:de) = reverse en | ||||||
|  |   in Just (d, Queue de []) | ||||||
|  | dequeue (Queue en (d:de)) = Just (d, Queue en de) | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue