haskell book
Post on 14-Apr-2018
252 Views
Preview:
TRANSCRIPT
-
7/30/2019 Haskell Book
1/87
S p e e d i n g T h r o u g h H a s k e l l
W i t h E x a m p l e C o d e !
M i h a i - R a d u P o p e s c u
q u e s t i o n s @ s t h a s k e l l . c o m
mailto:questions@sthaskell.com -
7/30/2019 Haskell Book
2/87
T o # h a s k e l l , w h e r e a l l q u e s t i o n s a r e a n s w e r e d i n m a j e s t i c s t e r e o .
-
7/30/2019 Haskell Book
3/87
C o n t e n t s
I . S t a r t i n g O u t 1
1 . I n t r o d u c t i o n 2
1 . 1 . A b o u t t h e B o o k . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1 . 2 . W h y H a s k e l l ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1 . 2 . 1 . F o r P r o g r a m m e r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1 . 2 . 2 . F o r M a t h e m a t i c i a n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1 . 2 . 3 . F o r E v e r y b o d y E l s e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1 . 3 . B e f o r e W e S t a r t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 . 3 . 1 . U s i n g G H C i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 . 3 . 2 . I n t e r a c t i v e v s . N o n i n t e r a c t i v e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 . 3 . 3 . L o a d i n g F i l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 . B a s i c s : F u n c t i o n s a n d L i s t s 6
2 . 1 . G e t t i n g S t a r t e d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 . 1 . 1 . S i m p l e A r i t h m e t i c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 . 1 . 2 . B o o l e a n A l g e b r a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 . 1 . 3 . C a l l i n g a n d M a k i n g F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 . 1 . 4 . I n x F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 . 2 . U s i n g L i s t s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 . 2 . 1 . I n t r o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 . 2 . 2 . B a s i c L i s t F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 0
2 . 2 . 3 . R a n g e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2
2 . 2 . 4 . C y c l i n g L i s t s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 3
2 . 3 . L i s t C o m p r e h e n s i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4
2 . 3 . 1 . B a s i c s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4
2 . 3 . 2 . A d v a n c e d U s e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5
2 . 3 . 3 . P r a c t i c a l A p p l i c a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 6
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m 1 7
3 . 1 . U n d e r s t a n d i n g T y p e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 7
3 . 1 . 1 . K n o w i n g T y p e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 7
3 . 1 . 2 . T y p e D e c l a r a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 8
3 . 2 . P o l y m o r p h i s m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9
3 . 2 . 1 . T y p e V a r i a b l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9
3 . 2 . 2 . T y p e c l a s s e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9
3 . 2 . 3 . M a k i n g P o l y m o r p h i c F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 0
3 . 2 . 4 . D r a w b a c k s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1
3 . 3 . C a s e S t u d y : T u p l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2
3 . 3 . 1 . L i s t s R e c a p . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2
3 . 3 . 2 . U n d e r s t a n d i n g T u p l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3
3 . 3 . 3 . F u n c t i o n s o n T u p l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 4
3 . 3 . 4 . A p p l i c a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5
i i i
-
7/30/2019 Haskell Book
4/87
C o n t e n t s
I I . G e t t i n g t h e H a n g o f I t 2 7
4 . E x p l o r i n g S y n t a x 2 8
4 . 1 . P a t t e r n M a t c h i n g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 8
4 . 1 . 1 . B a s i c s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 8
4 . 1 . 2 . A p p l i c a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 0
4 . 1 . 3 . M a t c h i n g w i t h C o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1
4 . 1 . 4 . A s p a t t e r n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2
4 . 1 . 5 . P a t t e r n s i n C o m p r e h e n s i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3
4 . 2 . O t h e r C o n s t r u c t s a n d E x p r e s s i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4
4 . 2 . 1 . G u a r d s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4
4 . 2 . 2 . W h e r e B i n d i n g s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 6
4 . 2 . 3 . L e t B i n d i n g s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 9
4 . 2 . 4 . B o n u s : C a s e E x p r e s s i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1
5 . R e c u r s i o n 4 3
5 . 1 . B a s i c I m p l e m e n t a t i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3
5 . 1 . 1 . U n d e r s t a n d i n g R e c u r s i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3
5 . 1 . 2 . P r a c t i c a l E x a m p l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5
5 . 1 . 3 . M o r e P a r a m e t e r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 6
5 . 2 . V a r i a t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 7
5 . 2 . 1 . U s i n g G u a r d s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 7
5 . 2 . 2 . M u l t i p l e R e g u l a r C a s e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 8
5 . 2 . 3 . I n n i t e R e c u r s i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 9
5 . 3 . F u r t h e r E x p a n s i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 9
5 . 3 . 1 . U s i n g N a t u r a l N u m b e r s [ F I X M E - m o v e t o a d v . t y p e s ] . . . . . . . . . . . . . . . . . . . 4 9
5 . 3 . 2 . A p p l i c a t i o n : Q u i c k s o r t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0
5 . 3 . 3 . D i s c u s s i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1
6 . A d v a n c e d F u n c t i o n s 5 3
6 . 1 . C u r r y i n g a n d P a r t i a l A p p l i c a t i o n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3
6 . 1 . 1 . F u n d a m e n t a l s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3
6 . 1 . 2 . P r o b l e m Z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4
6 . 1 . 3 . W h e n I t ' s N o t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5
6 . 2 . H i g h e r O r d e r F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6
6 . 2 . 1 . P a s s i n g F u n c t i o n s a s P a r a m e t e r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6
6 . 2 . 2 . F l i p p i n g t h e P a r a m e t e r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7
6 . 3 . M o r e U s e f u l F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 8
6 . 3 . 1 . m a p a n d z i p W i t h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 8
6 . 3 . 2 . W o r k i n g w i t h P r e d i c a t e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 0
6 . 3 . 3 . C o m p a r i s o n w i t h L i s t C o m p r e h e n s i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2
6 . 3 . 4 . A n o n y m o u s F u n c t i o n s ( L a m b d a s ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3
6 . 4 . F o l d s a n d S c a n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5
6 . 4 . 1 . E a t i n g a L i s t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5
6 . 4 . 2 . I n t r o d u c i n g F o l d s P r o p e r . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7
I I I . A p p e n d i c e s 6 8
A . M i s c e l l a n e o u s 6 9
A . 1 . F u n c t i o n s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 9
A . 1 . 1 . F i x i t y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 9
A . 1 . 2 . L a z i n e s s E x p l a i n e d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 0
i v
-
7/30/2019 Haskell Book
5/87
C o n t e n t s
A . 2 . C o n s t a n t s ( A . K . A . V a r i a b l e s ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1
A . 2 . 1 . L o c a l V a r i a b l e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1
B . T y p e s a n d T y p e c l a s s e s 7 4
B . 1 . T y p e c l a s s e s i n D e p t h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4
B . 1 . 1 . S h o w a n d R e a d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4
B . 1 . 2 . E q , O r d , E n u m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5
B . 1 . 3 . N u m e r i c T y p e c l a s s e s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 6
B . 2 . T y p e E r r o r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8
B . 2 . 1 . G e n e r a l T y p e E r r o r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8
B . 2 . 2 . A m b i g u o u s T y p e V a r i a b l e E r r o r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 9
B . 2 . 3 . M a k i n g C u s t o m E r r o r s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 0
C . M o d u l e s 8 2
C . 1 . D a t a . L i s t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2
v
-
7/30/2019 Haskell Book
6/87
P a r t I .
S t a r t i n g O u t
1
-
7/30/2019 Haskell Book
7/87
1 . I n t r o d u c t i o n
T h e H a s k e l l c o m m u n i t y h a s a n a c u t e s h o r t a g e
o f b u g g y u n d e r d o c u m e n t e d p r o g r a m s .
( s o r e a r )
1 . 1 . A b o u t t h e B o o k
W a r n i n g ! T h i s b o o k i s a w o r k i n p r o g r e s s . R e a d a t y o u r o w n r i s k !
H e l l o t h e r e ! T h i s i s a b o o k t h a t w i l l s h o w y o u a r o u n d t h e H a s k e l l p r o g r a m m i n g l a n g u a g e . I f y o u ' r e n o t
a l r e a d y f a m i l i a r ( o r t o o f a m i l i a r ) w i t h p r o g r a m m i n g i n a n o t h e r l a n g u a g e , y o u m i g h t n e e d t o p u t i n e x t r a
w o r k . D o n ' t b e d i s c o u r a g e d ! W h i l e t h e s t u i n t h e b e g i n n i n g m a y s e e m e x t r e m e l y b o r i n g , m i n d - b l o w i n g
t h i n g s s t a r t h a p p e n i n g l a t e r o n .
T h i s b o o k h a s a l o t o f f o o t n o t e s . Y o u d o n ' t h a v e t o r e a d t h e m , b u t s o m e t i m e s y o u m i g h t g a i n s o m e i n s i g h t
b y d o i n g s o . Y o u c a n c l i c k o n t h e m ( d o i t h e r e
1
) t o j u m p t o t h e m f a s t e r ( r e a d e r s f r o m t h e w e b s i t e m i g h t
w a n t t o d o w n l o a d t h e b o o k f o r t h i s r e a s o n ) . Y o u c a n c l i c k o n t h e t a b l e o f c o n t e n t s a s w e l l .
T h e w r i t i n g i n t h i s b o o k m a y n o t b e p o l i s h e d y e t , a n d s o m e t h i n g s m a y b e m i s s i n g , b u t t a k e a l o o k y o u
m i g h t j u s t l i k e i t !
1 . 2 . W h y H a s k e l l ?
E v e r y l a n g u a g e ( h u m a n o r c o m p u t e r ) i s u n i q u e . B u t t h e r e e x i s t s a s p e c i a l b r e e d o f l a n g u a g e s t h o s e t h a t
c h a l l e n g e a n d s h a p e t h e w a y o n e t h i n k s . H a s k e l l i s o n e o f t h e m l o s t i n n o v a t i o n i n a s e a o f c l i c h s . U n -
f o r t u n a t e l y , t h e o n l y p e o p l e a p p a r e n t l y i n t e r e s t e d i n H a s k e l l a r e a c a d e m i c s w h o b l i n d l y p u s h t h e b o u n d a r i e s
a n d g u r u s w h o w a n t t o l e a r n j u s t o n e m o r e l a n g u a g e .
O n a m o r e c o n c r e t e n o t e , i f H a s k e l l w e r e t o h a v e a l i s t o f p r e r e q u i s i t e s , i t w o u l d b e v e r y u n u s u a l i n d e e d
a t l e a s t t w o o f t h e f o l l o w i n g :
E x t e n s i v e p r o g r a m m i n g e x p e r i e n c e
A b a c k g r o u n d i n m a t h e m a t i c s
A n i n c l i n a t i o n t o w a r d s t h e a b s t r a c t
P e r s e v e r e n c e
H a r d w o r k
1 . 2 . 1 . F o r P r o g r a m m e r s
I n e v e r i n t e n d e d t o ( a n d s t i l l d o n ' t q u i t e ) t a k e p r o g r a m m i n g s e r i o u s l y . I w a n t e d s o m e t h i n g q u i c k , f u n a n d
c h a l l e n g i n g t o k i l l s o m e t i m e , c l e a r m y t h o u g h t s a n d , a b o v e a l l , s t o p p e r f o r m i n g r e p e t i t i v e t a s k s . M y r s t
l a n g u a g e w a s P y t h o n e a s y , f u n , g o o d w i t h t h e t e a c h e r s . A f t e r a b o u t t w o w e e k s , I l e t i t g o a n d t r i e d
o t h e r s : C o m m o n L i s p , C , P e r l , J a v a , a n d n a l l y , I f e l l i n l o v e w i t h H a s k e l l .
O n e m i g h t s a y H a s k e l l i s a b i t d i e r e n t . F o r e x a m p l e , i n H a s k e l l :
1
I f i t d i d n ' t w o r k , y o u m i g h t w a n t t o d o w n l o a d t h e b o o k ( g o o g l e d o c s l i n k ) . I f i t s t i l l d o e s n ' t w o r k , g e t A d o b e R e a d e r .
2
http://get.adobe.com/reader/https://docs.google.com/uc?export=download&id=0Bx0Qn4cm6WCYMHlNN2dDSE1TUU9hSjlNTklYaFJ2QQ -
7/30/2019 Haskell Book
8/87
1 . I n t r o d u c t i o n
r e t u r n d o e s n ' t r e t u r n
C l a s s e s a r e n ' t r e a l l y c l a s s e s
V a r i a b l e s a r e a c t u a l l y c o n s t a n t s .
T h e c o d e m i g h t n o t e x e c u t e i n t h e o r d e r s h o w n o n t h e s c r e e n .
B e l o w a r e s o m e o f m y f a v o r i t e s n i p p e t s o f c o d e , e a c h o n a s e p a r a t e l i n e . T h e y ' r e c l a s s i c s , a n d r e a l l y s h o w
h o w H a s k e l l s t a n d s o u t .
1 f i b o n a c c i = 0 : 1 : z i p W i t h ( + ) f i b o n a c c i ( t a i l f i b o n a c c i )
2 p r i m e s = n u b B y ( \ x y - > ( g c d x y ) > 1 ) [ 2 . . ]
3 r a t i o n a l s = f i x ( ( 1 : ) . ( > > = \ x - > [ x + 1 , 1 % ( x + 1 ) ] ) ) : : [ R a t i o n a l ]
4 p o w e r s e t = f i l t e r M ( c o n s t [ T r u e , F a l s e ] )
5 h i s t o g r a m = m a p ( h e a d & & & l e n g t h ) . g r o u p . s o r t
1 . 2 . 2 . F o r M a t h e m a t i c i a n s
E v e r y t i m e s o m e o n e w r i t e s i = i + 1 , a m a t h e m a t i c i a n d i e s
2
. T h e f a c t i s t h a t m a n y m a t h e m a t i c i a n s h a v e
c r i n g e d a t t h e s i g h t o f a c o m p u t e r s c r e e n w i t h s o m e r a n d o m c o d e . T h e y a r e u s e d t o w r i t i n g s t u l i k e :
L e t a f u n c t i o n f : Z Z
,f(x) = 2y + 3
, w h e r e y = |x 4|
. I f w e c o n s i d e r s e t A =
{5,3, . . . , 11}, w e s h a l l m a p f u n c t i o n f o v e r A, n a m i n g t h e r e s u l t s e t B . W e s h a l l a l s o c o n s i d e r s e t
C =
f2 (x) |x A, x < 10
.
O n e d o e s n o t s i m p l y c o d e s u c h a t h i n g i n C o r P y t h o n a t l e a s t n o t w i t h o u t m u t i l a t i n g m a t h s . H o w e v e r ,
i n H a s k e l l , t h e r e s u l t i s p l e a s i n g t o t h e e y e a n d e a s y t o u n d e r s t a n d , t o o ( e v e r y t h i n g f o l l o w i n g t h e i s a
c o m m e n t ) .
1 f : : I n t e g e r - > I n t e g e r
2 f x = 2 * y + 3
3 w h e r e y = a b s ( x - 4 )
4
5 a = [ - 5 , - 3 . . 1 1 ] - - w e ' l l s e e l a t e r w h y a , b , a n d c a r e l o w e r c a s e
6 b = m a p f a
7 c = [ ( f x ) ^ 2 | x < - a , x < 1 0 ] - - t h i s r e a l l y w o r k s !
T h e m a t h e m a t i c a l a p p l i c a t i o n s o f H a s k e l l a r e e n d l e s s . I t ' s e v e n p o s s i b l e t o d e n e a n d w o r k w i t h m o n o i d s
[ X R E F ] !
1 . 2 . 3 . F o r E v e r y b o d y E l s e
I n t e l l i g e n t a n d / o r h a r d w o r k i n g p e o p l e w i l l e n j o y t h e c h a l l e n g e p r o v i d e d b y H a s k e l l . A t t h e e n d o f t h e j o u r n e y ,
t h e t r a v e l l e r w i l l l o o k a t t h e w o r l d w i t h n e w e y e s , s a t i s e d t h a t h e i s n o w b e t t e r e q u i p p e d t o u n d e r s t a n d t h e
U n i v e r s e .
T h i s i s a l l b e c a u s e H a s k e l l i s r i d d l e d w i t h c o m p l e x , c o u n t e r i n t u i t i v e o r s i m p l y m i n d - b o g g l i n g e l e m e n t s . L e t ' s
t a k e a l o o k a t s o m e t h i n g i n t e r e s t i n g .
1 c o m p a r e 2 3 - - w o r k s
2 c o m p a r e ( 2 3 ) - - d o e s n ' t w o r k
3 ( c o m p a r e 2 ) 3 - - w o r k s ! !
T h i s p a r a d o x ( l e t ' s c a l l i t P r o b l e m Z e v e n t h o u g h i t ' s a c t u a l l y a f e a t u r e ) , a n d m o r e , w i l l b e p r e s e n t e d a n d
e x p l a i n e d t h r o u g h o u t t h e b o o k .
2
N o t r e a l l y , b u t h e y .
3
-
7/30/2019 Haskell Book
9/87
1 . I n t r o d u c t i o n
1 . 3 . B e f o r e W e S t a r t
T h i s b o o k r e q u i r e s a H a s k e l l i n t e r p r e t e r . F o r m o s t p e o p l e , t h e b e s t o p t i o n i s T h e H a s k e l l P l a t f o r m , a l t h o u g h
a l t e r n a t i v e s l i k e h u g s e x i s t . T h e H a s k e l l P l a t f o r m u s e s G H C i a s t h e i n t e r p r e t e r ( a n d a l s o h a s a c o m p i l e r ,
G H C ) , w h i c h i s w h a t w e w i l l u s e i n o u r e x a m p l e s .
1 . 3 . 1 . U s i n g G H C i
O n W i n d o w s , G H C i c a n b e o p e n e d u s i n g t h e S t a r t M e n u . O n L i n u x , M a c a n d o t h e r U N I X - l i k e s y s t e m s ,
g h c i c a n b e s t a r t e d u s i n g t h e s h e l l . B e l o w i s a t y p i c a l G H C i s e s s i o n o n L i n u x . W e t y p e s o m e e x p r e s s i o n s ,
l o a d a l e , a d d a m o d u l e , a n d n a l l y c h a n g e t h e p r o m p t t o s o m e t h i n g s h o r t e r .
W e a d d e d s o m e b l a n k l i n e s t o m a k e t h e o u t p u t m o r e r e a d a b l e , b u t i n r e a l l i f e t h e f o l l o w i n g i s a s i n g l e b l o c k
o f t e x t . T h e r e ' s n o n e e d t o u n d e r s t a n d i t f o r n o w t h e e x a m p l e i s j u s t t o g i v e a r o u g h i d e a o f t h e G H C i
e x p e r i e n c e .
1 e e @ b t : ~ $ g h c i
2 G H C i , v e r s i o n 7 . 4 . 1 : h t t p : / / w w w . h a s k e l l . o r g / g h c / : ? f o r h e l p
3 L o a d i n g p a c k a g e b a s e . . . l i n k i n g . . . d o n e .
4
5 P r e l u d e > 2 + 3
6 5
7 P r e l u d e > m a x 1 0 2
8 1 0
9
1 0 P r e l u d e > : l t e s t . h s - - l o a d i n g a f i l e
1 1 [ 1 o f 1 ] C o m p i l i n g M a i n ( t e s t . h s , i n t e r p r e t e d )
1 2 O k , m o d u l e s l o a d e d : M a i n .
1 3
1 4 * M a i n > i m p o r t C o n t r o l . M o n a d - - i m p o r t i n g a m o d u l e
1 5
1 6 * M a i n C o n t r o l . M o n a d > : s e t p r o m p t " g h c i > "
1 7
1 8 g h c i > : q - - y o u c a n a l s o e x i t w i t h C t r l - D
1 9 L e a v i n g G H C i .
2 0 e e @ b t : ~ $
1 . 3 . 2 . I n t e r a c t i v e v s . N o n i n t e r a c t i v e
G H C i i s v e r y n a r r o w l y s c o p e d . I t ' s m o r e o f a d e b u g g e r : y o u c a n ' t j u s t c o p y - p a s t e s o u r c e l e s i n t o i t , l i k e
i n P y t h o n t h e r e a r e k e y d i e r e n c e s b e t w e e n i n t e r a c t i v e c o d e a n d c o d e l o a d e d f r o m a l e . F o r e x a m p l e ,
c o m p a r e t h e f o l l o w i n g ( f r o m n o w o n w e w i l l u s e g h c i > t o i n d i c a t e a n i n t e r a c t i v e p r o m p t i t ' s s e t u s i n g
: s e t p r o m p t " g h c i > " ) :
1 a = 5
2 b = a + 1
1 g h c i > l e t a = 5
2 g h c i > l e t b = a + 1
W e w i l l l a t e r ( i n [ X R E F ] ) u n d e r s t a n d w h y t h e s e d i e r e n c e s o c c u r . F o r n o w , r e m e m b e r t h a t t h e s e c o n d
e x a m p l e i s w o r k i n g i n s i d e a H a s k e l l p r o g r a m ( G H C i i s , a f t e r a l l , w r i t t e n i n H a s k e l l ) .
4
http://www.haskell.org/hugs/http://hackage.haskell.org/platform/ -
7/30/2019 Haskell Book
10/87
1 . I n t r o d u c t i o n
1 . 3 . 3 . L o a d i n g F i l e s
M a n y e x a m p l e s w i l l u s e f u n c t i o n s w r i t t e n i n a s e p a r a t e l e , w h i c h i s t h e n l o a d e d i n t o G H C i . L e t ' s g o a h e a d
a n d o p e n u p v i m ( o r a n y o t h e r t e x t e d i t o r ) a n d w r i t e s o m e d e c l a r a t i o n s t o g e t t h e h a n g o f i t .
1 - - F i l e : b a s i c . h s
2 a = 2
3 b = 3
4 c = a + b
N o w l e t ' s l o a d t h i s i n t o G H C i a n d s e e i f i t w o r k s ( t h e l e n e e d s t o b e i n t h e d i r e c t o r y w h e r e G H C i w a s
s t a r t e d , o r i t w o n ' t w o r k
3
) .
1 g h c i > : l b a s i c . h s - - t h i s i s h o w w e l o a d
2 [ 1 o f 1 ] C o m p i l i n g M a i n ( b a s i c . h s , i n t e r p r e t e d )
3 O k , m o d u l e s l o a d e d : M a i n .
4 g h c i > a + 1
5 3
6 g h c i > c - b = = a
7 T r u e
8 g h c i > : r - - t h i s r e l o a d s t h e f i l e i f w e c h a n g e i t
9 [ 1 o f 1 ] C o m p i l i n g M a i n ( b a s i c . h s , i n t e r p r e t e d )
1 0 O k , m o d u l e s l o a d e d : M a i n .
1 1 g h c i >
A g a i n , t h e r e i s n o n e e d t o d i s s e c t t h e a b o v e p i e c e s o f c o d e w h a t ' s i m p o r t a n t i s k n o w i n g h o w t o l o a d a l e
( : l f i l e . h s ) a n d r e l o a d i t ( : r ) .
3
A c t u a l l y , i f t h e f u l l p a t h i s g i v e n i t w i l l w o r k j u s t n e , b u t i t ' s c u m b e r s o m e .
5
http://www.vim.org/ -
7/30/2019 Haskell Book
11/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
I k i n d a e x p e c t f u n c t i o n s t o r e t u r n s o m e t h i n g
s e n s i b l e , b u t I g u e s s I ' m s p o i l e d b y e x p o s u r e
t o f u n c t i o n a l p r o g r a m m i n g .
( k z m )
2 . 1 . G e t t i n g S t a r t e d
2 . 1 . 1 . S i m p l e A r i t h m e t i c
I t i s v e r y e a s y t o u s e G H C i a s a c a l c u l a t o r . I t s u p p o r t s a l l t h e b a s i c o p e r a t i o n s a n d s o m e e x t r a f u n c t i o n s
( m i n , a b s , e x p e t c . ) . A s a n a d d e d b o n u s , H a s k e l l s u p p o r t s a r b i t r a r i l y l a r g e i n t e g e r s .
1 g h c i > 4 + 5 * 6
2 3 4
3 g h c i > e x p 2
4 7 . 3 8 9 0 5 6 0 9 8 9 3 0 6 5
5 g h c i > 1 0 - 4 - ( m a x 5 6 )
6 0
7 g h c i > 1 0 ^ 6 0
8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
T h e r e s t i l l a r e s o m e p r o b l e m s , e s p e c i a l l y w i t h t h e - o p e r a t o r .
1 g h c i > - 3
2 - 3
3 g h c i > - 3 + 4
4 1
5 g h c i > m i n - 3 4 - - t h i s g i v e s a v e r y l o n g e r r o r m e s s a g e .
G H C i t r e a t s m i n - 3 4 a s m i n - ( 3 4 ) , a n d t h e r e f o r e t h i n k s w e w a n t t o s u b t r a c t 3 4 f r o m m i n . T h i s m a y
l o o k s t r a n g e , e v e n d o w n r i g h t s t u p i d , b u t G H C i h a s a v e r y g o o d r e a s o n : b e i n g a b l e t o c a l l f u n c t i o n s a s
a r g u m e n t s i s e s s e n t i a l i n H a s k e l l .
W e h a v e n o c h o i c e b u t t o o b l i g e a s o l u t i o n i s t o w r a p - 3 i n p a r e n t h e s e s .
1 g h c i > m i n ( - 3 ) 4
2 - 3
2 . 1 . 2 . B o o l e a n A l g e b r a
I n H a s k e l l , w o r k i n g w i t h b o o l e a n s o r t e s t i n g f o r e q u a l i t y i s a s s t r a i g h t f o r w a r d a s c a n b e e x p e c t e d .
1 g h c i > F a l s e | | F a l s e - - r i g h t a s s o c i a t i v e
2 F a l s e
3 g h c i > T r u e | | F a l s e & & F a l s e - - & & h a s a h i g h e r p r e c e d e n c e
4 T r u e
6
-
7/30/2019 Haskell Book
12/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
5 g h c i > n o t T r u e
6 F a l s e
7 g h c i > n o t F a l s e | | n o t T r u e
8 T r u e
9 g h c i > 5 = = 6 - - e q u a l i t y i s n o t a s s o c i a t i v e
1 0 F a l s e
1 1 g h c i > 5 / = 7 - - p r o g r a m m e r s b e w a r e , i t ' s n o t ! =
1 2 T r u e
A c o m b i n a t i o n o f r i g h t a s s o c i a t i v i t y a n d s o m e t h i n g c a l l e d l a z i n e s s ( w e ' l l g e t b a c k t o i t l a t e r ) m e a n s t h a t | |
s t o p s a t t h e r s t T r u e s t a t e m e n t f o u n d ( f r o m t h e l e f t ) . L i k e w i s e , & & s t o p s a t t h e r s t F a l s e .
A n o t h e r i n t e r e s t i n g f a c t i s t h a t | | a n d & & a r e n o t b u i l t i n t o t h e l a n g u a g e , t h e y ' r e f u n c t i o n s l i k e a l l o t h e r s .
2 . 1 . 3 . C a l l i n g a n d M a k i n g F u n c t i o n s
F u n c t i o n s a r e c a l l e d w i t h s p a c e b e t w e e n t h e p a r a m e t e r s . S o m e f u n c t i o n s a c c e p t o n l y o n e p a r a m e t e r , s o m e
m o r e
1
. W e h a v e a l r e a d y s e e n s o m e f u n c t i o n s , s o h e r e a r e s o m e m o r e e x a m p l e s , a n d t h e n w e ' l l m o v e o n .
1 g h c i > s u c c 3 - - n e e d s t o h a v e a l o g i c a l s u c c e s s o r
2 4
3 g h c i > s u c c ' a '
4 ' b '
5 g h c i > p r e d ' Y ' - - s a m e h e r e
6 ' X '
7 g h c i > p r e d " H e l l o " - - e r r o r
T h e r e i s a n i m p o r t a n t d i s t i n c t i o n t o b e m a d e r e g a r d i n g f u n c t i o n c a l l s . P a r e n t h e s e s a r o u n d t h e a r g u m e n t s
o n l y s e t p r e c e d e n c e , n o t s e p a r a t e t h e f u n c t i o n f r o m t h e a r g u m e n t s . I t ' s e s s e n t i a l n o t t o g e t f o o l e d , e s p e c i a l l y
i n t h e n e x t e x a m p l e .
1 g h c i > f o o ( b a r 1 0 ) - - i n C t h i s w o u l d b e f o o ( b a r ( 1 0 ) )
2
3 g h c i > ( f o o b a r ) 1 0
4 g h c i > f o o b a r 1 0 - - t h i s i s e q u i v a l e n t t o t h e a b o v e
5
6 g h c i > f o o b a r ( b a z 1 0 ) 8 - - i n C : f o o ( b a r , b a z ( 1 0 ) , 8 )
A l s o , f u n c t i o n a p p l i c a t i o n h a s t h e h i g h e s t p r e c e d e n c e , s o i f y o u w r i t e f o o 1 0 + 8 , i t m e a n s ( f o o 1 0 ) + 8
( f o r m o r e d e t a i l s s e e A . 1 . 1 ) .
W e ' r e s l i g h t l y f a m i l i a r w i t h d e n i n g f u n c t i o n s , t o o ( t h e 1 . 2 . 2 e x a m p l e ) . L e t ' s p l a y a l i t t l e m o r e w i t h t h e m .
O b v i o u s l y , w e c a n r e f e r t o o t h e r f u n c t i o n s i n a d e n i t i o n . A n o t h e r t h i n g t o n o t e i s t h a t f u n c t i o n s c a n ' t b e g i n
w i t h u p p e r c a s e l e t t e r s .
1 - - F i l e : f u n c t i o n s . h s
2 t r i p l e x = 3 * x
3 s t r a n g e A d d i t i o n x y = x + t r i p l e y
4 s q u a r e T w o x y = ( x + y ) ^ 2
5
6 c = 4 - - t h i s o n e t a k e s z e r o p a r a m e t e r s
1
T e c h n i c a l l y a l l f u n c t i o n s a c c e p t o n l y o n e p a r a m e t e r , b u t i t ' s n o t h e a l t h y t o t h i n k l i k e t h i s , a t l e a s t f o r n o w r e m e m b e r
P r o b l e m Z ( i n t r o d u c e d i n 1 . 2 . 3 ) ?
7
-
7/30/2019 Haskell Book
13/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
B e f o r e w e s t a r t . . . c a l l i n g a r o u n d , l e t ' s t a l k a l i t t l e a b o u t t h e l a s t l i n e . T h i s i s a v e r y i n t e r e s t i n g c a s e i n d e e d
c i s w h a t w e w o u l d c a l l i n o t h e r l a n g u a g e s a v a r i a b l e . I t ' s d e c l a r e d t h e s a m e a s a f u n c t i o n , b u t i t t a k e s
z e r o p a r a m e t e r s s o i t ' s a c o n s t a n t
2
( H a s k e l l g i v e s a n e r r o r i f y o u d o c = 4 t h e n c = 5 i n t h e s a m e l e ) .
U n l i k e m o s t l a n g u a g e s , i n H a s k e l l a z e r o - p a r a m e t e r f u n c t i o n a n d a c o n s t a n t a r e r e a l l y t h e s a m e . T h i s ,
s t r a n g e l y e n o u g h , h a s s o m e t h i n g t o d o w i t h P r o b l e m Z w e ' l l u n d e r s t a n d w h a t t h a t m e a n s s o o n e n o u g h .
1 g h c i > : l f u n c t i o n s . h s
2 [ 1 o f 1 ] C o m p i l i n g M a i n ( f u n c t i o n s . h s , i n t e r p r e t e d )
3 O k , m o d u l e s l o a d e d : M a i n .
4 g h c i > t r i p l e 2
5 6
6 g h c i > s t r a n g e A d d i t i o n 1 0 2 0
7 7 0
8 g h c i > s q u a r e T w o 5 6
9 1 2 1
1 0 g h c i > t r i p l e c
1 1 1 2
1 2 g h c i > s t r a n g e A d d i t i o n ( t r i p l e 2 ) c
1 3 1 8
B e f o r e w e c o n t i n u e , l e t ' s l o o k a b i t a t H a s k e l l ' s i f - e l s e . T h e r s t t h i n g w e n o t i c e i s t h a t t h e e l s e p a r t i s
m a n d a t o r y . W h y ? E v e r y f u n c t i o n h a s t o r e t u r n s o m e t h i n g . W h y ? H a s k e l l i s m o r e l i k e m a t h s t h e r e a r e
n o v a r i a b l e s t o c h a n g e , s o a f u n c t i o n t h a t d o e s n ' t r e t u r n a n y t h i n g w o u l d n ' t w o r k
3
. D o e s f(x) =
m a k e
s e n s e ?
L e t ' s a d d s o m e t h i n g t o f u n c t i o n s . h s ( t h e q u o t e i s a v a l i d c h a r a c t e r i n f u n c t i o n n a m e s ) a n d s e e w h a t
h a p p e n s . I n d e n t a t i o n i s e s s e n t i a l i n H a s k e l l b e c a u s e t h a t ' s h o w t h e i n t e r p r e t e r i d e n t i e s b l o c k s o f c o d e .
1 - - F i l e : f u n c t i o n s . h s ( C O N T I N U E D )
2 s t r a n g e A d d i t i o n ' x y = i f x > y
3 t h e n x + t r i p l e y
4 e l s e y + t r i p l e x
1 g h c i > : r - - w e w o n ' t b e s h o w i n g l o a d / r e l o a d f r o m n o w o n
2 [ 1 o f 1 ] C o m p i l i n g M a i n ( f u n c t i o n s . h s , i n t e r p r e t e d )
3 O k , m o d u l e s l o a d e d : M a i n .
4 g h c i > s t r a n g e A d d i t i o n 5 3
5 1 4
6 g h c i > s t r a n g e A d d i t i o n 3 5
7 1 8
8 g h c i > s t r a n g e A d d i t i o n ' 5 3
9 1 4
1 0 g h c i > s t r a n g e A d d i t i o n ' 3 5
1 1 1 4
2 . 1 . 4 . I n x F u n c t i o n s
U n t i l n o w w e ' v e c a l l e d f u n c t i o n s b y p u t t i n g t h e m b e f o r e t h e a r g u m e n t s , l i k e a b o v e . B u t i f w e s u r r o u n d
f u n c t i o n s w i t h b a c k q u o t e s , w e c a n m a k e t h e m i n x ( p u t t h e m b e t w e e n t h e p a r a m e t e r s ) , m u c h l i k e + o r * .
W a r n i n g ! B a c k q u o t e s w o r k o n l y w i t h t w o - p a r a m e t e r f u n c t i o n s .
2
M a t h e m a t i c i a n s w i l l u n d e r s t a n d t h i s r i g h t a w a y .
3
T h e r e i s a l s o a t e c h n i c a l r e a s o n , e x p l a i n e d i n d e t a i l i n [ X R E F ]
8
-
7/30/2019 Haskell Book
14/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
1 g h c i > 3 ` s q u a r e T w o ` 4
2 4 9
3 g h c i > 1 0 ` s t r a n g e A d d i t i o n ` 2 0
4 7 0
5 g h c i > 2 ` t r i p l e ` - - e r r o r ( a n d l o o k s s t u p i d , t o o )
B a c k q u o t e s a r e u s u a l l y a d o p t e d t o m a k e f u n c t i o n s m o r e r e a d a b l e , b u t t h e y c a n a l s o b e u s e d t o c r e a t e c h a i n s .
W a t c h o u t f o r a s s o c i a t i v i t y ( d e f a u l t l e f t ) a n d p r e c e d e n c e ( d e f a u l t h i g h e s t ) b u i l t - i n f u n c t i o n s d o n ' t u s e t h e
d e f a u l t s ( s e e A . 1 . 1 ) .
1 g h c i > 2 ` s q u a r e T w o ` 3 ` s q u a r e T w o ` 4 ` s q u a r e T w o ` 5
2 7 1 5 7 1 6
3 g h c i > ( ( 2 ` s q u a r e T w o ` 3 ) ` s q u a r e T w o ` 4 ) ` s q u a r e T w o ` 5
4 7 1 5 7 1 6
5 g h c i > 2 ` s q u a r e T w o ` ( 3 ` s q u a r e T w o ` ( 4 ` s q u a r e T w o ` 5 ) )
6 4 9 8 1 5 3 6 4
I f a f u n c t i o n n a m e c o n t a i n s o n l y s y m b o l s ( l i k e + + , , o r - . - ) , i t ' s a u t o m a t i c a l l y i n x . W e c a n s t i l l c a l l i n x
f u n c t i o n s b e f o r e t h e a r g u m e n t s , b y p u t t i n g t h e m i n p a r e n t h e s e s . T h i s r e a l l y h e l p s w i t h P r o b l e m Z .
1 g h c i > ( + ) 2 3
2 5
3 g h c i > ( * ) 4 5
4 2 0
5 g h c i > ( / ) 1 0 4
6 2 . 5
2 . 2 . U s i n g L i s t s
2 . 2 . 1 . I n t r o
L i s t s a r e t o H a s k e l l l i k e . . . w e l l , t h e r e ' s r e a l l y n o c o m p a r i s o n . T h e y a r e t h e m o s t u s e d d a t a s t r u c t u r e . T h e y :
A r e h o m o g e n o u s m i x i n g , f o r e x a m p l e , n u m b e r s w i t h c h a r a c t e r s g i v e s a n e r r o r .
H a v e v a r i a b l e l e n g t h
4
.
C a n b e i n n i t e l y l o n g
5
.
A r e s i n g l y l i n k e d l i s t s c a n o n l y b e t r a v e r s e d f r o m l e f t t o r i g h t
6
.
W e ' l l d e n e s o m e l i s t s i n a l e s o w e c a n e x p l o r e f u n c t i o n s t h a t o p e r a t e o n t h e m .
1 - - F i l e : l i s t s . h s
2 n u m b e r s = [ 1 , 3 , 7 , 5 , 6 , 6 , 8 , 1 0 ]
3 l a n g u a g e s = [ " l i s p " , " h a s k e l l " , " c " , " p e r l " , " r u b y " , " p y t h o n " ]
4 h e l l o = " H e l l o , W o r l d ! " - - s a m e a s [ ' H ' , ' e ' , ' l ' , ' l ' , . . . a n d s o o n ]
5 l i s t O f L i s t s = [ [ 1 , 5 , 7 , 9 ] , [ 2 , 4 , 6 ] , [ 1 ] ]
6 e m p t y L i s t = [ ]
F o r s t a r t e r s , + + c o n c a t e n a t e s t w o l i s t s . I t ' s o n e o f t h e m o s t b a s i c o p e r a t o r s . I t ' s a s s o c i a t i v e , s o ( a + + b ) + + c
i s e q u i v a l e n t t o a + + ( b + + c )
7
.
4
W e l l , t e c h n i c a l l y s p e a k i n g t h e y c a n ' t c h a n g e ( n o t h i n g c a n ) , b u t f o r a l l i n t e n t s a n d p u r p o s e s t h e y a r e v a r i a b l e i n l e n g t h .
5
T h i s i s b e c a u s e o f l a z i n e s s . F u n c t i o n s i n H a s k e l l ( l i k e t h o s e f r o m 2 . 1 . 2 ) a r e m a d e t o u s e o n l y a s m u c h i n f o r m a t i o n a s i s
n e c e s s a r y , a n d n o t m o r e . I f w e c o m b i n e w i t h & & a n i n n i t e n u m b e r o f F a l s e s , d o w e r e a l l y n e e d t o g e t p a s t t h e r s t o n e ?
6
T h i s m e a n s t h a t a c c e s s i n g t h e l a s t e l e m e n t r e q u i r e s g o i n g t h r o u g h t h e w h o l e l i s t w a t c h o u t !
7
W i t h o u t t h i s b a s i c p r o p e r t y , l i s t s w o u l d b e s t u p i d .
9
-
7/30/2019 Haskell Book
15/87
-
7/30/2019 Haskell Book
16/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
1 g h c i > l e t x s = [ 1 , 2 , 3 , 4 , 5 , 6 ]
2 g h c i > h e a d x s
3 1
4 g h c i > t a i l x s
5 [ 2 , 3 , 4 , 5 , 6 ]
6 g h c i > l a s t x s
7 6
8 g h c i > i n i t x s
9 [ 1 , 2 , 3 , 4 , 5 ]
1 0 g h c i > x s ! ! 4
1 1 5
1 2 g h c i > t a k e 2 x s
1 3 [ 1 , 2 ]
1 4 g h c i > d r o p 2 x s
1 5 [ 3 , 4 , 5 , 6 ]
1 6 g h c i > l e n g t h x s
1 7 6
1 8 g h c i > n u l l x s
1 9 F a l s e
O n e t h i n g w o r t h p o i n t i n g o u t i s t h a t , d u e t o t h e n a t u r e o f l i s t s i n H a s k e l l , a c c e s s i n g t h e l a s t e l e m e n t o f a l i s t
i s c o n s i d e r a b l y s l o w e r t h a n a c c e s s i n g t h e r s t o n e . T h i s i s b e c a u s e , i n t e r n a l l y , a c c e s s i n g a n e l e m e n t r e q u i r e s
g o i n g t h r o u g h
1 1
t h e o n e s b e f o r e i t . [ F I X M E - e l a b o r a t e w i t h e x a m p l e s ]
W a r n i n g ! G i v i n g o u t - o f - b o u n d s v a l u e s t o h e a d , t a i l , i n i t , l a s t , a n d ! ! t h r o w s a n e x c e p t i o n .
1 g h c i > h e a d [ ]
2 * * * E x c e p t i o n : P r e l u d e . h e a d : e m p t y l i s t
3 g h c i > l ! ! 1 0 0
4 * * * E x c e p t i o n : P r e l u d e . ( ! ! ) : i n d e x t o o l a r g e
5 g h c i > l ! ! ( - 2 )
6 * * * E x c e p t i o n : P r e l u d e . ( ! ! ) : n e g a t i v e i n d e x
S o m e m o r e u s e f u l f u n c t i o n s :
m a x i m u m t h e m a x i m u m o f a l i s t
1 2
m i n i m u m t h e m i n i m u m
s u m t h e s u m o f a l i s t o f n u m b e r s
p r o d u c t l i k e w i s e , t h e p r o d u c t
e l e m c h e c k s i f a n e l e m e n t i s a m e m b e r o f a l i s t
1 3
( u s u a l l y c a l l e d i n x b e c a u s e i t ' s m o r e r e a d a b l e )
n o t E l e m t h e o p p o s i t e o f e l e m ( a l s o c a l l e d i n x ) .
1 g h c i > l e t x s = [ 8 , 5 , 3 , 4 , 1 0 , 2 ]
2 g h c i > m a x i m u m x s
3 1 0
4 g h c i > m i n i m u m x s
5 2
6 g h c i > s u m x s
1 1
T h i s i s n o t e n t i r e l y a c c u r a t e , b u t i t w i l l d o f o r n o w .
1 2
T o c a l c u l a t e t h e m a x i m u m , t h e e l e m e n t s n e e d t o h a v e s o m e s o r t o f l o g i c a l o r d e r . A l i s t o f n u m b e r s o r a l i s t o f c h a r a c t e r s a r e
n e , b u t a l i s t o f f u n c t i o n s i s n o t .
1 3
N e e d s t o b e a b l e t o e q u a t e e l e m e n t s . T h i s m a y s e e m p r e t t y s t a n d a r d , b u t n o t a l l s t u c a n e q u a l o t h e r s t u ( w e ' l l d i s c u s s t h i s
i n - d e p t h i n [ X R E F ] ) .
1 1
-
7/30/2019 Haskell Book
17/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
7 3 2
8 g h c i > p r o d u c t x s
9 9 6 0 0
1 0 g h c i > 5 ` e l e m ` x s
1 1 T r u e
1 2 g h c i > 2 2 ` e l e m ` x s
1 3 F a l s e
1 4 g h c i > 2 2 ` n o t E l e m ` x s
1 5 T r u e
A s p e c i a l c a s e , c o n c a t , o p e r a t e s o n l i s t s o f l i s t s : i t a t t e n s t h e m . I t o n l y r e m o v e s o n e l a y e r , t h o u g h .
1 g h c i > c o n c a t [ [ 2 , 3 ] , [ 4 , 5 ] ]
2 [ 2 , 3 , 4 , 5 ]
3 g h c i > c o n c a t [ [ 5 ] ]
4 [ 5 ]
5 g h c i > c o n c a t [ [ [ 5 ] ] ]
6 [ [ 5 ] ]
T h e r e a r e s o m e f u n c t i o n s t h a t o p e r a t e o n l i s t s o f B o o l s :
a n d r e t u r n s T r u e i f a l l t h e e l e m e n t s a r e T r u e , F a l s e o t h e r w i s e .
o r T r u e i f a t l e a s t o n e i s T r u e , F a l s e o t h e r w i s e .
1 g h c i > a n d [ T r u e , T r u e , F a l s e ]
2 F a l s e
3 g h c i > a n d [ T r u e , T r u e , T r u e ]
4 T r u e
5 g h c i > o r [ T r u e , F a l s e , F a l s e ]
6 T r u e
7 g h c i > o r [ F a l s e , F a l s e , F a l s e ]
8 F a l s e
A n d n e i t h e r l a s t n o r l e a s t ( s e e C . 1 f o r m o r e ) , r e v e r s e r e v e r s e s a l i s t . I t ' s n o t v e r y e c i e n t , t h o u g h , s o a v o i d
r e v e r s i n g l o n g l i s t s .
1 g h c i > r e v e r s e [ 1 , 2 , 3 , 4 , 5 ]
2 [ 5 , 4 , 3 , 2 , 1 ]
2 . 2 . 3 . R a n g e s
M a n y t i m e s w e n e e d t o c o n s t r u c t l i s t s a c c o r d i n g t o c e r t a i n r u l e s . P r o b a b l y t h e s i m p l e s t w a y i s b y u s i n g
r a n g e s . L e t ' s s e e s o m e e x a m p l e s a n d t h e n d i s c u s s t h e m .
1 g h c i > [ 1 , 2 . . 2 0 ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
3 g h c i > [ 1 . . 2 0 ]
4 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
5 g h c i > [ 1 , 3 . . 1 5 ]
6 [ 1 , 3 , 5 , 7 , 9 , 1 1 , 1 3 , 1 5 ]
7 g h c i > [ 1 , 7 . . 3 0 ]
8 [ 1 , 7 , 1 3 , 1 9 , 2 5 ]
9 g h c i > [ 3 , 2 . . - 1 0 ]
1 0 [ 3 , 2 , 1 , 0 , - 1 , - 2 , - 3 , - 4 , - 5 , - 6 , - 7 , - 8 , - 9 , - 1 0 ]
1 2
-
7/30/2019 Haskell Book
18/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
T h e f o l l o w i n g w i l l n o t w o r k .
1 g h c i > [ 1 , 2 , 4 , 8 . . 1 2 8 ] - - n o p e
2 g h c i > [ 1 . . 3 9 , 4 0 ] - - n o t t h i s , e i t h e r
I t ' s p r e t t y o b v i o u s : t h e s e r a n g e s g e n e r a t e s e q u e n c e s w h e r e t h e d i e r e n c e b e t w e e n c o n s e c u t i v e t e r m s i s c o n -
s t a n t ( a r i t h m e t i c p r o g r e s s i o n s ) .
T h e y a l w a y s g o l i k e t h i s : [ f i r s t e l e m e n t , n e x t e l e m e n t . . l a s t e l e m e n t ] .
I f w e n e e d t o g e n e r a t e c o n s e c u t i v e t h i n g s , [ a . . n ] i s s h o r t h a n d f o r [ a , a + 1 . . n ] w h i c h i s s h o r t e r t h a n
w r i t i n g t h e w h o l e l i s t b y h a n d .
F u r t h e r m o r e , o n l y a r i t h m e t i c p r o g r e s s i o n s a r e p o s s i b l e u s i n g r a n g e s . Y o u c a n , h o w e v e r , s p e c i f y a n y s t e p ,
i n c l u d i n g n e g a t i v e o r n o n i n t e g e r
1 4
o n e s .
1 g h c i > [ 1 , 2 . 1 . . 5 ]
2 [ 1 . 0 , 2 . 1 , 3 . 2 , 4 . 3 0 0 0 0 0 0 0 0 0 0 0 0 0 1 , 5 . 4 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ]
W a r n i n g ! U s i n g n o n i n t e g e r s i n r a n g e s y i e l d s u n d e s i r e a b l e r e s u l t s d u e t o r o u n d i n g e r r o r s .
I n t e r e s t i n g l y , i f t h e u p p e r b o u n d i s o m i t t e d , r a n g e s g e n e r a t e i n n i t e l i s t s , a s e x e m p l i e d b e l o w
1 5
. I f y o u d o
t h i s , p r e s s C t r l - C t o s t o p i t .
1 g h c i > [ 1 . . ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 , 2 1 ,
2 2 , 2 3 , 2 4 , 2 5 , 2 6 , 2 7 , 2 8 , 2 9 , 3 0 , 3 1 , 3 2 , 3 3 , 3 4 , 3 5 , 3 6 , 3 7 , 3 8 , 3 9 ,
4 0 , 4 1 , 4 2 , 4 3 , 4 4 , 4 5 , 4 6 , 4 7 , 4 8 , 4 9 , 5 0 , 5 1 , 5 2 , 5 3 , 5 4 , 5 5 , 5 6 , 5 7 ,
5 8 , 5 9 , 6 0 , 6 1 , 6 2 , 6 3 , 6 4 , 6 5 , 6 6 , 6 7 , 6 8 , 6 9 , 7 0 , 7 1 , 7 2 , 7 3 , 7 4 , 7 5 ,
7 6 , 7 7 , 7 8 , 7 9 , 8 0 , 8 1 , 8 2 , 8 3 , 8 4 , 8 5 , 8 6 , 8 7 , 8 8 , 8 9 , 9 0 , 9 1 , 9 2 , 9 3 ,
9 4 , 9 5 , 9 6 , 9 7 , 9 8 , 9 9 , 1 0 0 , 1 0 1 , 1 0 2 , 1 0 3 , 1 0 4 , ^ C I n t e r r u p t e d .
H o w i s t h i s u s e f u l ? W e l l , l e t ' s r e m e m b e r t h a t H a s k e l l i s l a z y , s o u n l e s s w e w a n t s o m e t h i n g u n w i s e , l i k e
p r i n t i n g a l l t h e e l e m e n t s o f a n i n n i t e l i s t ( s e e a b o v e ) w e s h o u l d b e i n t h e c l e a r . W e a r e a l r e a d y f a m i l i a r
w i t h t a k e , s o l e t ' s u s e i t i n c o n j u n c t i o n w i t h r a n g e s .
1 g h c i > t a k e 2 0 [ 1 . . ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
3 g h c i > t a k e 5 [ 1 3 , 2 6 . . ]
4 [ 1 3 , 2 6 , 3 9 , 5 2 , 6 5 ]
5 g h c i > t a k e 1 1 [ 1 , - 2 . . ]
6 [ 1 , - 2 , - 5 , - 8 , - 1 1 , - 1 4 , - 1 7 , - 2 0 , - 2 3 , - 2 6 , - 2 9 ]
W e i m m e d i a t e l y n o t i c e t h a t t h e c o m p u t a t i o n s h a v e e n d e d , s o c l e a r l y H a s k e l l d i d n ' t e v a l u a t e t h e e n t i r e i n n i t e
l i s t . I n f a c t , w h e n w e l e a r n m o r e a b o u t f u n c t i o n s , w e ' l l s e e e x a c t l y h o w l a z i n e s s w o r k s
1 6
.
A l s o , t a k e n o t e : r a n g e s a r e n ' t l i m i t e d t o n u m b e r s .
2 . 2 . 4 . C y c l i n g L i s t s
W h a t i f w e w a n t a n u m b e r r e p e a t e d o v e r a n d o v e r ? W e c a n d o [ 1 , 1 . . ] , a n d t h a t ' s p e r f e c t l y o k a y . T h e r e
a r e t h r e e f u n c t i o n s w e h a v e o m i t t e d f r o m 2 . 2 . 2 , a n d t h e y w i l l m a k e i t m o r e r e a d a b l e . A d d i t i o n a l l y , t h e y h a v e
t h e a d v a n t a g e o f b e i n g f u n c t i o n s , w h i c h w i l l h e l p w i t h P r o b l e m Z . H e r e t h e y a r e :
1 4
W i t h d e c i m a l s .
1 5
D i s c l a i m e r : w e w o n ' t a c t u a l l y p r i n t i n n i t e l y m a n y n u m b e r s .
1 6
I t ' s n o t u n l i k e i f - e l s e i n o t h e r l a n g u a g e s i f t h e s t a t e m e n t i s t r u e , t h e e l s e b r a n c h w o n ' t e v a l u a t e a n d v i c e v e r s a .
1 3
-
7/30/2019 Haskell Book
19/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
r e p e a t r e p e a t s a n e l e m e n t i n t o a n i n n i t e l i s t . W e ' l l p r o b a b l y w a n t t o t a k e a n i t e n u m b e r o f e l e m e n t s ,
t h o u g h .
c y c l e r e p e a t s a n e n t i r e l i s t . A g a i n , w e ' l l w a n t t o t a k e e l e m e n t s .
r e p l i c a t e r e p e a t s a n e l e m e n t a s p e c i e d n u m b e r o f t i m e s .
1 g h c i > t a k e 1 0 ( r e p e a t 5 )
2 [ 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 ]
3 g h c i > t a k e 1 0 ( c y c l e [ 5 , 4 ] )
4 [ 5 , 4 , 5 , 4 , 5 , 4 , 5 , 4 , 5 , 4 ]
5 g h c i > r e p l i c a t e 1 0 4
6 [ 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ]
W a r n i n g ! D o n o t c o n f u s e r e p e a t a n d c y c l e t h e y d o v e r y d i e r e n t t h i n g s .
1 g h c i > t a k e 1 0 ( r e p e a t [ 5 , 4 ] )
2 [ [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] , [ 5 , 4 ] ]
3 g h c i > t a k e 1 0 ( c y c l e [ 5 , 4 ] )
4 [ 5 , 4 , 5 , 4 , 5 , 4 , 5 , 4 , 5 , 4 ]
2 . 3 . L i s t C o m p r e h e n s i o n s
2 . 3 . 1 . B a s i c s
W e ' v e s e e n h o w t o d e c l a r e , m a n i p u l a t e a n d , t o a n e x t e n t , g e n e r a t e l i s t s . W e w i l l n o w l e a r n o n e o f t h e m o s t
p o w e r f u l t o o l s i n a l l o f H a s k e l l , l i s t c o m p r e h e n s i o n s . L e t ' s s t a r t w i t h b a s i c e x a m p l e s a n d m o v e o n f r o m t h e r e .
1 g h c i > [ x | x < - [ 1 . . 2 0 ] ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
3 g h c i > [ x | x < - [ 1 . . 2 0 ] , e v e n x ]
4 [ 2 , 4 , 6 , 8 , 1 0 , 1 2 , 1 4 , 1 6 , 1 8 , 2 0 ]
5 g h c i > [ x | x < - [ 1 . . 2 0 ] , x > 6 ]
6 [ 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
7 g h c i > [ x | x < - [ 1 . . 2 0 ] , e v e n x , x > 6 ]
8 [ 8 , 1 0 , 1 2 , 1 4 , 1 6 , 1 8 , 2 0 ]
9 g h c i > [ x | x < - [ 1 . . 2 0 ] , e v e n x , x > 6 , o d d x ]
1 0 [ ]
1 1 g h c i > [ a + + b | a < - [ " H a s k e l l " , " C " ] , b < - [ " s y n t a x " , " t y p e s " ] ]
1 2 [ " H a s k e l l s y n t a x " , " H a s k e l l t y p e s " , " C s y n t a x " , " C t y p e s " ]
1 3 g h c i > [ x + 3 | x < - [ 1 , 6 . . 3 0 ] ]
1 4 [ 4 , 9 , 1 4 , 1 9 , 2 4 , 2 9 ]
1 5 g h c i > [ x + 3 | x < - [ 1 , 6 . . 3 0 ] , e v e n x ]
1 6 [ 9 , 1 9 , 2 9 ]
1 7 g h c i > [ a + + " i s f u n ! " | a < - [ " H a s k e l l " , " P e r l " , " C " , " L i s p " ] ]
1 8 [ " H a s k e l l i s f u n ! " , " P e r l i s f u n ! " , " C i s f u n ! " , " L i s p i s f u n ! " ]
A n y o n e w h o ' s s e e n a n d u n d e r s t o o d m a t h e m a t i c a l s e t c o m p r e h e n s i o n s c a n j u s t s k i m t h e r e s t o f t h e s e c t i o n .
2 . 3 . 2 i s w o r t h r e a d i n g c a r e f u l l y , t h o u g h .
L i s t c o m p r e h e n s i o n s h a v e t w o c o m p o n e n t s ( l e t ' s t a k e [ 2 * x | x < - [ 1 , 3 , 4 ] , o d d x ] a s a n e x a m p l e ) :
T h e l e f t h a n d - s i d e c o n t a i n s t h e e x p r e s s i o n t o b e e v a l u a t e d ( i n o u r c a s e , 2 * x )
T h e r i g h t h a n d - s i d e h a s :
1 4
-
7/30/2019 Haskell Book
20/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
A b a s e l i s t f r o m w h i c h x i s e x t r a c t e d : x < - [ 1 , 3 , 4 ]
A l i s t o f p r e d i c a t e s ( l t e r s ) t h a t m u s t b e s a t i s e d ( i n t h i s c a s e , w e h a v e o n l y o n e ) : o d d x
I n o r d e r t o u n d e r s t a n d b e t t e r , l e t ' s m a n u a l l y c a l c u l a t e t h e a b o v e c o m p r e h e n s i o n , s t e p b y s t e p .
1 . F i n d t h e b a s e l i s t : [ 1 , 3 , 4 ] .
2 . T a k e t h e r s t e l e m e n t f r o m t h e b a s e l i s t a n d c a l l i t x
.
3 . C h e c k t h e t r u t h v a l u e o f t h e p r e d i c a t e s ( i n t h i s c a s e , o n l y o n e ) : o d d x .
4 . I f a l l t h e p r e d i c a t e s a r e s a t i s e d , e v a l u a t e t h e l e f t h a n d - s i d e e x p r e s s i o n f o r x : 2 * x t h e n a d d i t t o t h e
r e s u l t l i s t .
5 . D o t h e a b o v e s t e p s f o r a l l e l e m e n t s i n t h e b a s e l i s t .
V o i l : t h e r e s u l t i s [ 2 , 6 ] . I t ' s i m p o r t a n t t o n o t e t h a t i n t e r n a l l y , H a s k e l l d o e s t h i n g s a l i t t l e d i e r e n t l y .
H o w e v e r , t h e r e s u l t i s t h e s a m e s o i t s h o u l d n ' t b o t h e r u s .
2 . 3 . 2 . A d v a n c e d U s e s
W e c a n a l s o c o m b i n e t w o , t h r e e o r m o r e b a s e l i s t s , m o r e p r e d i c a t e s e t c . T h e o r d e r o f t h e b a s e l i s t s d e t e r m i n e s
t h e o r d e r o f t h e r e s u l t l i s t , a s w e c a n s e e f r o m t h e r s t e x a m p l e . T h e p r e d i c a t e s a r e c a l c u l a t e d l e f t - t o - r i g h t
s o i t ' s r e c o m m e n d e d t h a t m o r e p o w e r f u l l t e r s b e p u t r s t .
1 g h c i > [ 1 0 * a + b | a < - [ 1 . . 3 ] , b < - [ 1 . . 3 ] ]
2 [ 1 1 , 1 2 , 1 3 , 2 1 , 2 2 , 2 3 , 3 1 , 3 2 , 3 3 ]
3 g h c i > [ x * y | x < - [ 2 , 4 , 6 ] , y < - [ 1 0 , 1 0 0 , 1 0 0 0 ] ]
4 [ 2 0 , 2 0 0 , 2 0 0 0 , 4 0 , 4 0 0 , 4 0 0 0 , 6 0 , 6 0 0 , 6 0 0 0 ]
5 g h c i > [ x * y | x < - [ 1 . . 4 ] , y < - [ 1 . . 3 ] , e v e n ( x + y ) ]
6 [ 1 , 3 , 4 , 3 , 9 , 8 ]
7 g h c i > [ x + y | x < - [ 3 . . 6 ] , y < - [ 2 , 4 , 8 ] , x < = y ]
8 [ 7 , 1 1 , 8 , 1 2 , 1 3 , 1 4 ]
B e c a u s e a l i s t c o m p r e h e n s i o n i s a n e x p r e s s i o n , w e c a n p u t i t i n t h e l e f t h a n d - s i d e o f a n o t h e r o n e c o m p r e -
h e n s i o n s i n s i d e c o m p r e h e n s i o n s .
1 g h c i > l e t x s s = [ [ 1 , 2 , 3 , 4 , 5 ] , [ 4 , 5 , 6 , 7 ] , [ 7 , 8 , 9 , 1 0 ] ]
2 g h c i > [ [ x | x < - x s , x > = 5 ] | x s < - x s s ]
3 [ [ 5 ] , [ 5 , 6 , 7 ] , [ 7 , 8 , 9 , 1 0 ] ]
M o r e o v e r , i n s t e a d o f s p e c i f y i n g a n u p p e r b o u n d i n a b a s e l i s t , w e c a n t a k e a n u m b e r o f r e s u l t s a f t e r w a r d s .
1 g h c i > t a k e 5 [ a | a < - [ 1 . . ] , b < - [ 1 . . a ] , c < - [ 1 . . b ] , a ^ 2 = = b ^ 2 + c ^ 2 ]
2 [ 5 , 1 0 , 1 3 , 1 5 , 1 7 ]
T h e r e a r e a f e w c a t c h e s , h o w e v e r , s o m e v e r y s e r i o u s .
1 g h c i > t a k e 2 0 [ x | x < - [ 1 . . ] , x < 1 0 ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ^ C I n t e r r u p t e d - - t h i s w o u l d n e v e r f i n i s h
3 g h c i > t a k e 5 [ x | x < - [ 1 . . ] , x < 1 0 ]
4 [ 1 , 2 , 3 , 4 , 5 ] - - t h i s w o r k s f i n e b e c a u s e H a s k e l l i s l a z y
W a r n i n g ! M a k e s u r e H a s k e l l c a n n d a t l e a s t a s m a n y i t e m s a s y o u t a k e .
S o m e p r o b l e m s a r e h a r d e r t o s p o t w i t h o u t r u n n i n g t h e c o d e . F o r i n s t a n c e , H a s k e l l n e v e r t r i e s x = 2 i n t h e
f o l l o w i n g e x a m p l e , b e c a u s e i t h a s p l e n t y o f y s t o c h o o s e f r o m .
1 5
-
7/30/2019 Haskell Book
21/87
2 . B a s i c s : F u n c t i o n s a n d L i s t s
1 g h c i > t a k e 2 0 [ x * y | x < - [ 1 . . ] , y < - [ 1 . . ] ]
2 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 , 2 0 ]
T o r e p e a t , H a s k e l l t r i e s a l l t h e v a l u e s f r o m t h e l a s t b a s e l i s t b e f o r e c o n t i n u i n g , s o a v o i d h a v i n g m o r e t h a n
o n e u n b o u n d e d b a s e l i s t , b e c a u s e i t w i l l e i t h e r n o t g i v e u s w h a t w e w a n t ( s e e a b o v e ) o r r u n i n d e n i t e l y
1 7
( s e e b e l o w ) . A c t u a l l y , t h e r e i s a m o u n t a i n o f t h e o r y o n t h i s i s s u e , s u c h a s t h i s p a p e r ( a d v a n c e d c o n t e n t ) .
1 g h c i > t a k e 1 0 [ x * y | x < - [ 1 . . ] , y < - [ 1 . . ] , y < = x ]
2 [ 1 ^ C I n t e r r u p t e d . - - b a d i d e a , r u n s i n d e f i n i t e l y
3 g h c i > t a k e 1 0 [ x * y | x < - [ 1 . . ] , y < - [ 1 . . x ] ]
4 [ 1 , 2 , 4 , 3 , 6 , 9 , 4 , 8 , 1 2 , 1 6 ] - - d o t h i s i n s t e a d
M a s t e r i n g a l l t h e s u b t l e t i e s o f l i s t c o m p r e h e n s i o n s t a k e s a l o t o f t i m e a n d e x p e r i e n c e , s o l e t ' s m o v e o n . W e ' l l
l e a r n a s w e g o .
2 . 3 . 3 . P r a c t i c a l A p p l i c a t i o n s
O n t h e u p s i d e , l i s t c o m p r e h e n s i o n s h a v e m a n y p r a c t i c a l u s e s . T h e c l a s s i c a l e x a m p l e i s d e t e r m i n i n g t h e
l e n g t h o f a l i s t . W e ' l l n e e d t o a p p l y o u r k n o w l e d g e o f l i s t f u n c t i o n s h e r e , n a m e l y s u m .
1 g h c i > s u m [ 1 | x < - [ 3 . . 2 0 ] ]
2 1 8
I t w o r k s , b u t w e ' r e n o t r e a l l y u s i n g x a n y w h e r e , s o i t ' s a w a s t e o f a p e r f e c t l y g o o d v a r i a b l e n a m e . T h e
s o l u t i o n i s t o w r i t e a n u n d e r s c o r e w h e n e v e r a v a r i a b l e n a m e i s n o t n e e d e d .
1 g h c i > s u m [ 1 | _ < - [ 3 . . 2 0 ] ]
2 1 8
I f w e w a n t t o u s e t h e m r e p e a t e d l y , w e c a n d e c l a r e f u n c t i o n s w i t h l i s t c o m p r e h e n s i o n s . S o m e e x a m p l e s :
1 - - F i l e : c o m p r e f u n c t i o n s . h s
2 l e n g t h ' x s = s u m [ 1 | _ < - x s ]
3 v o w e l s s t r i n g = [ c | c < - s t r i n g , c ` e l e m ` " a e i o u " ]
4 r e m o v e V o w e l s s t r i n g = [ c | c < - s t r i n g , c ` n o t E l e m ` " a e i o u " ]
5 a l l S u m s x s y s = [ x + y | x < - x s , y < - y s ]
1 g h c i > l e n g t h ' [ 2 , 4 . . 1 0 ]
2 5
3 g h c i > l e n g t h ' [ ]
4 0
5 g h c i > v o w e l s " h e l l o w o r l d "
6 " e o o "
7 g h c i > r e m o v e V o w e l s " h e l l o w o r l d "
8 " h l l w r l d "
9 g h c i > a l l S u m s [ 1 , 2 , 3 ] [ 4 , 5 ]
1 0 [ 5 , 6 , 6 , 7 , 7 , 8 ]
F u n c t i o n s a n d l i s t s h a v e a l o t o f p o w e r . W e ' l l b e u s i n g t h e m e x t e n s i v e l y t h r o u g h o u t t h i s b o o k ( a n d e v e n
o u t s i d e i t ) s o i t ' s b e t t e r t o t a k e o u r t i m e a n d m a k e s u r e w e u n d e r s t a n d a s m u c h a s w e c a n a t t h i s p o i n t .
T h i n g s a r e o n l y g o i n g t o g e t h a r d e r a s w e a d v a n c e .
1 7
T h i s i s c a l l e d a d i v e r g i n g c o m p u t a t i o n .
1 6
http://www.dicta.org.uk/programming/LogicT.pdf -
7/30/2019 Haskell Book
22/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
I s h o u l d a c t u a l l y t h i n k b e f o r e c o d i n g , b u t t h e
t y p e s y s t e m i s s o g o o d : )
( C a l e )
3 . 1 . U n d e r s t a n d i n g T y p e s
3 . 1 . 1 . K n o w i n g T y p e s
I n m o s t o f t h e p r o g r a m m i n g w o r l d , e v e r y v a r i a b l e h a s a t y p e : a n i n t e g e r , a c h a r a c t e r , a b o o l e a n e t c . B u t
m o r e o f t e n t h a n n o t , t h e y ' r e t h e r e f o r c o s m e t i c p u r p o s e s m o s t c o m p i l e r s w i l l h a p p i l y a d d a n u m b e r t o a
c h a r a c t e r . T h a t d o e s n ' t m a k e m u c h s e n s e , d o e s i t ?
1
F o r t u n a t e l y , H a s k e l l h a s a s t r o n g t y p e s y s t e m . T h a t m e a n s t h a t h o w e v e r s i m i l a r t h e i r i n t e r n a l r e p r e s e n t a t i o n s
a r e , t h e c o m p i l e r w o n ' t a l l o w u s t o p e r f o r m i l l o g i c a l c a l c u l a t i o n s o n t h e m , s u c h a s m u l t i p l y i n g a n i n t e g e r
w i t h a b o o l e a n . T h i s m a y s e e m r e s t r i c t i v e ( a n d i t s o m e t i m e s i s ) , b u t i t h e l p s a v o i d c e r t a i n t y p e s o f e r r o r s
2
( t y p e e r r o r s ) .
M o r e o v e r , H a s k e l l f e a t u r e s s t a t i c t y p i n g , w h i c h m e a n s a l l t y p e s a r e k n o w n a t c o m p i l e - t i m e s o i f t h e p r o g r a m
h a s a t y p e e r r o r , i t w o n ' t e v e n c o m p i l e .
A s a n a d d e d b o n u s , H a s k e l l h a s t y p e i n f e r e n c e , s o w e d o n ' t n e e d t o m a n u a l l y s p e c i f y t h e t y p e o f e v e r y t h i n g
w e u s e . B a s i c a l l y , t h e c o m p i l e r c a n g u r e o u t o n i t s o w n t h a t 1 i s a n u m b e r o r " h e l l o " i s a s t r i n g
3
.
I n G H C i , w e c a n u s e : t t o d e t e r m i n e t h e t y p e o f a n e x p r e s s i o n ( : : m e a n s h a s t h e t y p e o f ) .
1 g h c i > : t ' a '
2 ' x ' : : C h a r
3 g h c i > : t " a b c d " - - s a m e a s [ ' a ' , ' b ' , ' c ' , ' d ' ]
4 " x x x " : : [ C h a r ]
5 g h c i > : t ' a ' : ' b ' : ' c ' : ' d ' : [ ] - - s a m e a s " a b c d "
6 ' a ' : ' b ' : ' c ' : ' d ' : [ ] : : [ C h a r ]
7
8 g h c i > : t F a l s e
9 F a l s e : : B o o l
1 0 g h c i > : t " h e l l o " = = " w o r l d " - - r e t u r n s F a l s e
1 1 " h e l l o " = = " w o r l d " : : B o o l
W e k n o w t h a t [ ] d e n o t e s a l i s t , s o i t ' s e a s y t o c o n c l u d e t h a t [ C h a r ] m e a n s a l i s t o f c h a r a c t e r s . T h e o t h e r s
a r e s e l f - e x p l a n a t o r y . T h i s i s j u s t a v e r y s h o r t e x a m p l e w e ' l l b e s e e i n g m o r e i n t h e f u t u r e .
W e a l s o i m m e d i a t e l y n o t i c e t h a t a l l t y p e s b e g i n w i t h a c a p i t a l l e t t e r . T h i s i s t h e r e a s o n w h y v a r i a b l e a n d
f u n c t i o n n a m e s a r e l o w e r c a s e
4
.
B e l o w i s a r e c a p o f t h e m o s t w i d e l y u s e d t y p e s i n H a s k e l l . W e ' l l b e r u n n i n g i n t o t h e s e a l l t h e t i m e .
1
O n e m i g h t a r g u e t h a t ' z ' i s ' a ' + 2 5 , b u t H a s k e l l w o n ' t l e t y o u d o t h a t .
2
I m a g i n e w o r k i n g o n a l o n g , d i c u l t p h y s i c s p r o b l e m a s k i n g f o r s o m e v e l o c i t y b u t a f t e r h o u r s o f c a l c u l a t i o n s , t h e r e s u l t i s
i n k i l o g r a m s . T h a t c a n ' t b e g o o d .
3
I t c a n e v e n d e d u c e m o r e c o m p l e x t y p e s j u s t a s e a s i l y .
4
T h e c a p i t a l i z a t i o n t e c h n i q u e u s e d f o r f u n c t i o n s i n H a s k e l l i s i n f o r m a l l y n a m e d c a m e l C a s e .
1 7
-
7/30/2019 Haskell Book
23/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
I n t i s a b o u n d e d i n t e g e r . O n 3 2 - b i t s y s t e m s i t ' s b e t w e e n 231 a n d 231 1 .
I n t e g e r i s a n a r b i t r a r i l y l a r g e i n t e g e r . I t ' s s l i g h t l y l e s s e c i e n t t h a n I n t .
F l o a t i s a s i n g l e - p r e c i s i o n o a t i n g p o i n t .
D o u b l e i s a d o u b l e - p r e c i s i o n o a t i n g p o i n t . D u e t o o p t i m i z a t i o n s , D o u b l e c a n b e f a s t e r t h a n F l o a t .
B o o l i s a b o o l e a n . I t c a n b e e i t h e r T r u e o r F a l s e . 1 a n d 0 w o n ' t w o r k .
C h a r r e p r e s e n t s ( b y d e f a u l t ) a U n i c o d e c h a r a c t e r .
I f w e t r y t o m i x w r o n g t y p e s , H a s k e l l t h r o w s a t y p e e r r o r . I t u s u a l l y l o o k s l i k e t h i s :
1 g h c i > 3 + ' a '
2
3 < i n t e r a c t i v e > : 1 : 1 :
4 N o i n s t a n c e f o r ( N u m C h a r )
5 a r i s i n g f r o m t h e l i t e r a l ` 3 '
6 P o s s i b l e f i x : a d d a n i n s t a n c e d e c l a r a t i o n f o r ( N u m C h a r )
7 I n t h e f i r s t a r g u m e n t o f ` ( + ) ' , n a m e l y ` 3 '
8 I n t h e e x p r e s s i o n : 3 + ' a '
9 I n a n e q u a t i o n f o r ` i t ' : i t = 3 + ' a '
B a s i c a l l y G H C i t e l l s u s t h a t i t d o e s n ' t k n o w h o w t o a d d ' a ' t o 3 , b e c a u s e ' a ' i s n o t a n u m b e r . A n e x t r e m e l y
d e t a i l e d d i s s e c t i o n o f t y p e e r r o r s i n G H C i i s p r e s e n t e d i n B . 2 . 1 .
3 . 1 . 2 . T y p e D e c l a r a t i o n s
I n H a s k e l l , f u n c t i o n s h a v e t y p e s t o o . W e m e n t i o n e d t h a t H a s k e l l c a n i n f e r t h e t y p e o f a n e x p r e s s i o n o n i t s
o w n . H o w e v e r , i t ' s p o s s i b l e t o m a n u a l l y d e c l a r e t h e t y p e o f a f u n c t i o n . T h i s h e l p s u s t o :
C l a r i f y o u r t h o u g h t s
M a k e c o d e m o r e r e a d a b l e
A v o i d m i s t a k e s
T h e t y p e d e c l a r a t i o n s m a k e f u n c t i o n s m u c h m o r e e x p r e s s i v e . A l t h o u g h H a s k e l l c o u l d h a v e i n f e r r e d b y i t s e l f
w h a t t h e t y p e s o f t h e f u n c t i o n s a r e ( l i k e i n t h e 2 . 1 . 3 a n d 2 . 3 . 3 e x a m p l e s ) , w e c h o s e t o g i v e e x p l i c i t t y p e
d e c l a r a t i o n s t o i l l u s t r a t e t h e m e t h o d .
I n t y p e d e c l a r a t i o n s t h e p a r a m e t e r s ( a n d t h e r e t u r n t y p e ) a r e s e p a r a t e d b y - > , r e g a r d l e s s o f h o w m a n y o f
t h e m t h e r e a r e
5
.
1 - - F i l e : f u n c t i o n s 2 . h s
2 t r i p l e : : I n t - > I n t
3 t r i p l e x = 3 * x
4
5 s t r a n g e A d d i t i o n : : I n t - > I n t - > I n t
6 s t r a n g e A d d i t i o n x y = x + t r i p l e y
7
8 s q u a r e T w o : : D o u b l e - > D o u b l e - > D o u b l e
9 s q u a r e T w o x y = ( x + y ) ^ 2
1 0
1 1 v o w e l s : : [ C h a r ] - > [ C h a r ]
1 2 v o w e l s w o r d = [ c | c < - w o r d , c ` e l e m ` " a e i o u " ]
1 3
1 4 s u m L i s t s : : [ I n t ] - > [ I n t ] - > [ I n t ]
1 5 s u m L i s t s x s y s = [ x + y | x < - x s , y < - y s ]
5
P r o b l e m Z i s a t w o r k h e r e . W e ' l l s e e w h y i t ' s n o t s o m e t h i n g l i k e I n t , I n t - > I n t .
1 8
-
7/30/2019 Haskell Book
24/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
W a r n i n g ! T h e p a r a m e t e r s a n d t h e r e t u r n t y p e a r e n o t d i e r e n t i a t e d a l l a r e s e p a r a t e d b y - > .
I n f a c t , t y p e d e c l a r a t i o n s g i v e u s s o m u c h i n f o r m a t i o n , t h a t w e c a n e v e n d e d u c e w h a t a f u n c t i o n d o e s s i m p l y
f r o m i t s t y p e d e c l a r a t i o n .
L e t ' s t a k e f : : [ C h a r ] - > I n t a s o u r e x a m p l e . T h i s f u n c t i o n t a k e s a l i s t o f c h a r a c t e r s ( a s t r i n g ) a n d r e t u r n s
a n i n t e g e r . W e c a n r e a s o n a b l y i n f e r t h a t t h e f u n c t i o n t a k e s t h e s t r i n g a n d p e r f o r m s s o m e s o r t o f c o u n t i n g
( s u c h a s n d i n g o u t t h e t o t a l l e n g t h o r c o u n t i n g a l l t h e s p a c e s ) o r o t h e r c a l c u l a t i o n ( s u c h a s a h a s h f u n c t i o n ) .
I n d e e d , f i s d e n e d l i k e s o : f x s = [ 1 | x < - x s , x ` e l e m ` " a b c " ] . T h e f u n c t i o n c o u n t s a l l o c c u r e n c e s
o f t h e l e t t e r s a , b , a n d c i n a g i v e n s t r i n g , s o o u r a s s e s s m e n t w a s s p o t - o n .
B e c a u s e o f t h i s t r e m e n d o u s a d v a n t a g e , w e ' l l b e g i v i n g t y p e d e c l a r a t i o n s t o ( a l m o s t ) e v e r y f u n c t i o n w e w r i t e
f r o m n o w o n .
O h , a n d j u s t s o w e d o n ' t f o r g e t . I f w e h a v e t w o f u n c t i o n s w i t h t h e s a m e t y p e d e c l a r a t i o n s , w e d o n ' t n e e d t o
r e p e a t o u r s e l v e s w e s e p a r a t e t h e f u n c t i o n n a m e s w i t h c o m m a s i n t h e i r t y p e d e c l a r a t i o n .
1 - - F i l e : f u n c t i o n s 2 . h s ( C O N T I N U E D )
2
3 s u m 1 , s u m 2 : : I n t - > I n t - > I n t - > I n t
4 s u m 1 x y z = x + y + z
5 s u m 2 x y z = x + y - z
3 . 2 . P o l y m o r p h i s m
3 . 2 . 1 . T y p e V a r i a b l e s
U n t i l n o w , w e ' v e d e n e d f u n c t i o n s o f t y p e I n t - > I n t o r [ C h a r ] - > I n t . B u t w h a t a b o u t f u n c t i o n s l i k e
h e a d ? I f w e g i v e h e a d a t y p e d e c l a r a t i o n o f [ I n t ] - > I n t , f o r e x a m p l e , i t w i l l w o r k o n l y w i t h i n t e g e r s . B u t
h e a d w o r k s w i t h b a s i c a l l y e v e r y t y p e o f e l e m e n t . S o w h a t i s h e a d ' s t y p e ?
1 g h c i > : t h e a d
2 h e a d : : [ a ] - > a
I n t h e a b o v e s n i p p e t o f c o d e , a i s w h a t w e c a l l a t y p e v a r i a b l e . I t ' s s o m e s o r t o f g e n e r i c t y p e . B e c a u s e h e a d
d o e s n ' t r e q u i r e s p e c i c b e h a v i o r o u t o f i t s p a r a m e t e r s ( u n l i k e = = , f o r i n s t a n c e , w h i c h r e q u i r e s p a r a m e t e r s
t h a t c a n b e e q u a t e d ) , w e c a n u s e a
6
t o m a k e a n e x t r e m e l y g e n e r a l f u n c t i o n . B a s i c a l l y [ a ] - > a t e l l s u s t h a t
i t a c c e p t s a l i s t o f a n y t y p e a n d r e t u r n s a n e l e m e n t o f t h e s a m e t y p e .
T h i s i s c a l l e d p o l y m o r p h i s m : w h e n e v e r w e u s e a t y p e v a r i a b l e , w e i n d i c a t e t h a t t h e f u n c t i o n d o e s n o t e x p e c t
a s p e c i c b e h a v i o r , s o i t b a s i c a l l y w o r k s a s - i s f o r a v a r i e t y o f i n p u t s .
3 . 2 . 2 . T y p e c l a s s e s
W e ' v e s e e n s o m e o f t h e m o s t s p e c i c t y p e s i g n a t u r e s ( l i k e I n t - > I n t o r C h a r - > I n t - > B o o l ) a n d t h e
m o s t g e n e r a l ( f o r e x a m p l e , [ a ] - > a , [ a ] - > [ a ] - > [ a ] ) , b u t w h a t i f w e r e q u i r e s o m e t h i n g i n b e t w e e n ?
F o r t h i s , w e n e e d t y p e c l a s s e s .
T y p e c l a s s e s g r o u p t y p e s w i t h a c o m m o n b e h a v i o r . E a c h i n t e r n a l d e n i t i o n o f a t y p e c l a s s c o n t a i n s a
c o l l e c t i o n o f f u n c t i o n s t h a t m u s t w o r k f o r a l l m e m b e r s o f t h a t t y p e c l a s s . I t ' s p r e t t y s i m p l e r e a l l y .
T y p e c l a s s e s a r e p r e s e n t e d i n d e p t h i n B . 1 ( s t r o n g l y r e c o m m e n d e d r e a d i n g ) . I n t h e f o l l o w i n g w e ' l l t r y t o
e x p l a i n h o w t h e y i n t e r a c t . F o r t h i s , w e ' l l c o n s i d e r N u m a n d I n t e g r a l . N u m c o n t a i n s a l l t y p e s o f n u m b e r s ,
b u t I n t e g r a l o n l y i n t e g e r s .
6
I t d o e s n ' t n e e d t o h a v e o n l y o n e l e t t e r , b u t f o r c o n c i s e n e s s , w e ' l l u s e a , b , c e t c .
1 9
-
7/30/2019 Haskell Book
25/87
-
7/30/2019 Haskell Book
26/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
( N u m a , I n t e g r a l b ) i s t h e l a s t t h i n g w e r e a d i t t e l l s u s t h a t a i s a n y t y p e o f n u m b e r b u t b i s a n
i n t e g e r
1 0
.
N o w w e ' l l a p p l y o u r n e w l y - g a i n e d k n o w l e d g e t o m a k e o u r f u n c t i o n s m o r e g e n e r a l . W e ' l l r e c y c l e e x a m p l e s
f r o m 2 . 1 . 3 , 2 . 3 . 3 , a n d 3 . 1 . 2 .
1 - - F i l e : p o l y f u n c t i o n s . h s
2
3 t r i p l e : : N u m a = > a - > a
4 t r i p l e x = 3 * x
5
6 s t r a n g e A d d i t i o n : : N u m a = > a - > a - > a
7 s t r a n g e A d d i t i o n x y = x + t r i p l e y
8
9 c : : N u m a = > a
1 0 c = 4
1 1
1 2 l e n g t h ' : : N u m a = > [ b ] - > a
1 3 l e n g t h ' x s = s u m [ 1 | _ < - x s ]
1 4
1 5 v o w e l s : : [ C h a r ] - > [ C h a r ]
1 6 v o w e l s w o r d = [ c | c < - w o r d , c ` e l e m ` " a e i o u " ]
1 7
1 8 s u m L i s t s : : N u m a = > [ a ] - > [ a ] - > [ a ]
1 9 s u m L i s t s x s y s = [ x + y | x < - x s , y < - y s ]
A g r e a t t h i n g a b o u t H a s k e l l i s t h a t i f o u r t y p e d e n i t i o n s a r e w r o n g ( i . e . , t h e y a r e i n c o m p a t i b l e w i t h t h e
f u n c t i o n i t s e l f ) , a n e r r o r i s t h r o w n . A p a r t f r o m t h e o b v i o u s a d v a n t a g e , t h i s m e a n s w e c a n c h e a t a n d l e t
H a s k e l l i n f e r t h e t y p e f o r u s , t h e n c o p y - p a s t e i t i n o u r l e .
1 g h c i > l e t s p a c e s x s = s u m [ 1 | x < - x s , x = = ' ' ]
2 g h c i > : t s p a c e s
3 s p a c e s : : N u m a = > [ C h a r ] - > a
1 - - F i l e : p o l y f u n c t i o n s . h s ( C O N T I N U E D )
2
3 s p a c e s : : N u m a = > [ C h a r ] - > a
4 s p a c e s x s = s u m [ 1 | x < - x s , x = = ' ' ]
3 . 2 . 4 . D r a w b a c k s
W e ' v e s e e n h o w w e c a n m a k e o u r p r o g r a m s m o r e r e a d a b l e a n d r e l i a b l e b y a d d i n g t y p e d e n i t i o n s . T h e g o o d
n e w s i s t h a t w e c a n ' t a c c i d e n t a l l y a d d c e n t i m e t e r s a n d i n c h e s . T h e b a d n e w s i s t h a t w e c a n ' t a d d a n i n t e g e r
a n d a o a t i n g p o i n t . W h a t
O f c o u r s e w e c a n d o s t u l i k e 4 + 5 . 1 , b u t t h a t ' s d i e r e n t . L e t ' s s e e .
1 g h c i > 4 + 5 . 1
2 9 . 1
3 g h c i > ( 4 : : I n t ) + ( 5 . 1 : : F l o a t )
4
5 < i n t e r a c t i v e > : 1 : 1 5 :
6 C o u l d n ' t m a t c h e x p e c t e d t y p e ` I n t ' w i t h a c t u a l t y p e ` F l o a t '
1 0
I t c a n b e a n y o n e o f t h e 7 t y p e s o f i n t e g e r H a s k e l l h a s .
2 1
-
7/30/2019 Haskell Book
27/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
7 I n t h e s e c o n d a r g u m e n t o f ` ( + ) ' , n a m e l y ` ( 5 . 1 : : F l o a t ) '
8 I n t h e e x p r e s s i o n : ( 4 : : I n t ) + ( 5 . 1 : : F l o a t )
9 I n a n e q u a t i o n f o r ` i t ' : i t = ( 4 : : I n t ) + ( 5 . 1 : : F l o a t )
I t s e e m s t h a t i t a l l b l o w s u p i f w e f o r c e t h e t y p e s . T h e a b o v e e r r o r t e l l s u s , q u i t e c l e a r l y , t h a t i t e x p e c t e d 5 . 1
t o b e a n I n t r a t h e r t h a n a F l o a t . H a s k e l l c a n ' t a d d t w o d i e r e n t t y p e s
1 1
. T h e k e e n r e a d e r w i l l r e m e m b e r
t h a t w e p r e v i o u s l y m e n t i o n e d p o l y m o r p h i c c o n s t a n t s . W e c a n e a s i l y c h e c k i f t h i s i s t h e c a s e h e r e .
1 g h c i > : t 4
2 4 : : N u m a = > a
3 g h c i > : t 5 . 1
4 5 . 1 : : F r a c t i o n a l a = > a
5 g h c i > : t ( 4 + 5 . 1 )
6 ( 4 + 5 . 1 ) : : F r a c t i o n a l a = > a
A h a ! S o 4 c a n t a k e a n y n u m b e r t y p e ( I n t , C o m p l e x , R a t i o n a l , F l o a t , D o u b l e e t c . ) , b u t 5 . 1 i s a f r a c t i o n a l
( F l o a t , D o u b l e e t c . ) . N a t u r a l l y , a d d i n g t h e m m e a n s t h a t 4 c a n h a v e o n l y t h e t y p e s 5 . 1 c a n h a v e , s o a n y t h i n g
i n F r a c t i o n a l
1 2
.
R i g h t n o w , t h i n g s m a y s e e m c o n f u s i n g ( a n d r i g h t f u l l y s o ) . T h e m o s t i m p o r t a n t t h i n g t o r e m e m b e r h e r e i s
t o m a k e t y p e d e c l a r a t i o n s a s g e n e r a l a s p o s s i b l e , b u t n o t m o r e g e n e r a l . I n b u l l e t p o i n t s :
S p e c i c d e c l a r a t i o n s l i m i t a f u n c t i o n t o a c e r t a i n t y p e o r t y p e c l a s s : t r i p l e : : I n t - > I n t .
G e n e r a l d e c l a r a t i o n s m a k e a f u n c t i o n v e r s a t i l e
1 3
: t r i p l e : : N u m a = > a - > a .
T o o g e n e r a l d e c l a r a t i o n s a r e i n c o r r e c t a n d t h r o w e r r o r s : t r i p l e : : a - > a .
I f w e ' r e n o t s u r e o f a t y p e , w e s h o u l d l e a v e i t b l a n k . T h e c o m p i l e r a l w a y s i n f e r s t y p e s b e t t e r t h a n t h e u s e r
1 4
.
S o m e f o o d f o r t h o u g h t : w h a t h a p p e n s i f a t y p e c l a s s h a s t h e s a m e n a m e a s a t y p e ? S o , f o r e x a m p l e , w e h a v e
s i l l y F u n c t i o n : : D e r p a = > a - > D e r p . H o w d o w e d i s t i n g u i s h b e t w e e n t h e r s t D e r p a n d t h e s e c o n d
o n e ? W e l l , t h e y ' r e l o g i c a l l y d i e r e n t : o n e i s a t y p e , t h e o t h e r a t y p e c l a s s . I t d o e s n ' t m a t t e r i f b o t h h a v e
t h e s a m e n a m e . D o e s a n y o n e e v e r c o n f u s e J a c k t h e a c t o r w i t h J a c k t h e m o v i e c h a r a c t e r
1 5
? I n t e c h n i c a l
t e r m s , w e s a y t h a t t h e y h a v e d i e r e n t k i n d s ( w e ' l l t a l k m o r e a b o u t t h e m i n [ X R E F ] ) . T h e c o m p i l e r w o n ' t
e v e r c o n f u s e t h e m , a n d a s i t h a p p e n s , i t ' s a p r e t t y f r e q u e n t l y u s e d t e c h n i q u e : w e d o n ' t w a n t t o . . . p o l l u t e
t h e n a m e s p a c e .
3 . 3 . C a s e S t u d y : T u p l e s
3 . 3 . 1 . L i s t s R e c a p
W e m e n t i o n e d l i s t s a r e h o m o g e n o u s a n d h a v e v a r i a b l e l e n g t h ( 2 . 2 . 1 ) . B e f o r e c o n t i n u i n g , l e t ' s e x p l o r e t h i s
f r o m a n e w p e r s p e c t i v e : t y p e s .
1 g h c i > : t [ 1 , 2 , 3 ]
2 [ 1 , 2 , 3 ] : : N u m t = > [ t ]
3 g h c i > : t [ 1 , 2 , 3 , 4 ]
4 [ 1 , 2 , 3 , 4 ] : : N u m t = > [ t ]
5 g h c i > : t ( : )
1 1
T h e a d d i t i o n o p e r a t o r ( + ) i s o f t h e t y p e N u m a = > a - > a - > a .
1 2
A c t u a l l y , i t s h o u l d l o o k l i k e ( 4 + 5 . 1 ) : : ( N u m a , F r a c t i o n a l a ) = > a , b u t b e c a u s e F r a c t i o n a l i s i n c l u d e d i n N u m , i t ' s
t h e s a m e t h i n g .
1 3
S o m e t i m e s w e w a n t t o a v o i d t h a t . F o r e x a m p l e , m a y b e w e w a n t a f u n c t i o n t h a t c a n o n l y t r i p l e i n t e g e r s s o w e d o n ' t a c c i d e n t a l l y
r o u n d i n g e r r o r s .
1 4
U n l e s s , o f c o u r s e , i t ' s r e l e a s e d s o f t w a r e t y p e d e n i t i o n s a r e h a l f t h e d o c u m e n t a t i o n .
1 5
O r f o r p h y s i c i s t s ,
at h e l e n g t h w i t h
at h e a c c e l e r a t i o n .
2 2
-
7/30/2019 Haskell Book
28/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
6 ( : ) : : a - > [ a ] - > [ a ]
7 g h c i > : t ( + + )
8 ( + + ) : : [ a ] - > [ a ] - > [ a ]
E v e n i f w e d o n ' t k n o w a n y t h i n g a b o u t l i s t s , f r o m t h e a b o v e p i e c e o f c o d e w e c a n d r a w t w o v e r y i m p o r t a n t
c o n c l u s i o n s :
N o m a t t e r h o w l o n g a l i s t i s , i t s t y p e i s t h e s a m e . T h i s m a k e s t h e m e s s e n t i a l l y v a r i a b l e i n l e n g t h
w e h a v e d o - i t - a l l f u n c t i o n s t h a t c a n l e n g t h e n ( : , + + e t c . ) o r s h o r t e n ( t a k e , d r o p e t c . ) a n y l i s t ,
r e g a r d l e s s o f l e n g t h .
B o t h : a n d + + t a k e i d e n t i c a l t y p e s a s p a r a m e t e r s , s o t h e r e ' s n o w a y w e c a n g e t a w a y w i t h a d d i n g a
d i e r e n t t y p e o f e l e m e n t t o a l i s t .
T h i s t r a n s l a t e s i n t o o u r c u r r e n t k n o w l e d g e o f l i s t s : v a r i a b l e l e n g t h a n d h o m o g e n e i t y . I t r e i n f o r c e s t h e i d e a
t h a t w e c a n l e a r n a g r e a t d e a l s i m p l y b y a n a l y z i n g t y p e s .
3 . 3 . 2 . U n d e r s t a n d i n g T u p l e s
L e t ' s s a y w e h e a r d o f a n e w H a s k e l l f e a t u r e : w e c a n p u t s t u i n p a r e n t h e s e s a n d s u r r o u n d t h e m b y c o m m a s
t h e s e s t r u c t u r e s a r e c a l l e d t u p l e s
1 6
. U n f o r t u n a t e l y a l l t h e d o c u m e n t a t i o n i s l o s t ( y e a h , r i g h t ) . I t m a y n o t
s e e m l i k e a l o t , b u t w e c a n e x t r a c t a w e a l t h o f i n f o r m a t i o n f r o m t h e l i t t l e w e k n o w .
F i r s t , l e t ' s s e e i f w e g o t t h e s y n t a x r i g h t a n d t r y v a r i o u s t h i n g s t o s e e i f t h e y w o r k .
1 g h c i > ( 4 , 5 , 6 )
2 ( 4 , 5 , 6 )
3 g h c i > ( 1 0 , 2 , 3 , 3 )
4 ( 1 0 , 2 , 3 , 3 )
5 g h c i > ( 8 5 , " H e l l o " )
6 ( 8 5 , " H e l l o " )
7 g h c i > ( ' a ' , " H a s k e l l " , 1 5 , " n e v e r " , " e a s y " )
8 ( ' a ' , " H a s k e l l " , 1 5 , " n e v e r " , " e a s y " )
9 g h c i > ( )
1 0 ( )
1 1 g h c i > ( ' a ' )
1 2 ' a '
1 3 g h c i > ( 2 0 )
1 4 2 0
L e t ' s d r a w s o m e p a r t i a l c o n c l u s i o n s a b o u t t u p l e s :
T h e y c a n b e a n y s i z e .
T h e y a r e n o t n e c e s s a r i l y h o m o g e n o u s .
T h e r e i s s u c h a t h i n g a s a n e m p t y t u p l e : ( ) .
S i n g l e - e l e m e n t t u p l e s a r e t h e s a m e a s t h e e l e m e n t s t h e m s e l v e s
1 7
.
L e t ' s s e e w h a t t y p e s t h e y a r e .
1 g h c i > : t ( 4 , 5 , 6 )
2 ( 4 , 5 , 6 ) : : ( N u m t 1 , N u m t 2 , N u m t ) = > ( t , t 1 , t 2 )
3 g h c i > : t ( 1 0 , 2 , 3 , 3 )
4 ( 1 0 , 2 , 3 , 3 ) : : ( N u m t 1 , N u m t 3 , N u m t 2 , N u m t ) = > ( t , t 1 , t 2 , t 3 )
5 g h c i > : t ( 8 5 , " H e l l o " )
1 6
F o r t h e r e c o r d , t h a t ' s n o t a n e w f e a t u r e .
1 7
T h a t ' s p r e t t y o b v i o u s a l l w e d i d i s s u r r o u n d t h e m w i t h p a r e n t h e s e s .
2 3
-
7/30/2019 Haskell Book
29/87
3 . T y p e s , T y p e c l a s s e s , a n d P o l y m o r p h i s m
6 ( 8 5 , " H e l l o " ) : : N u m t = > ( t , [ C h a r ] )
7 g h c i > : t ( ' a ' , " H a s k e l l " , 1 5 , " n e v e r " , " e a s y " )
8 ( ' a ' , " H a s k e l l " , 1 5 , " n e v e r " , " e a s y " )
9 : : N u m t = > ( C h a r , [ C h a r ] , t , [ C h a r ] , [ C h a r ] )
1 0 g h c i > : t ( )
1 1 ( ) : : ( )
1 2 g h c i > : t ( ' a ' )
1 3 ( ' a ' ) : : C h a r
1 4 g h c i > : t ( 2 0 )
1 5 ( 2 0 ) : : N u m a = > a
S o t h e t y p e o f t h e t u p l e c o n t a i n s t h e t y p e s o f a l l t h e e l e m e n t s i n s i d e i t . T h i s m e a n s :
T u p l e s h a v e a n e s s e n t i a l l y x e d l e n g t h
1 8
.
A n e m p t y t u p l e i s i t s o w n t y p e : ( ) i s o f t y p e ( ) .
W e ' v e a l s o i n a d v e r t e n t l y l e a r n e d t h a t t y p e d e n i t i o n s c a n b e s p l i t a c r o s s m u l t i p l e l i n e s ( a s l o n g a s t h e n e x t
l i n e s a r e i n d e n t e d s l i g h t l y t o t h e r i g h t ) .
3 . 3 . 3 . F u n c t i o n s o n T u p l e s
W e n o w m a k e a h o r r i b l e t y p o :
1 g h c i > ( , )
2
3 < i n t e r a c t i v e > : 1 : 1 :
4 N o i n s t a n c e f o r ( S h o w ( a 0 - > b 0 - > ( a 0 , b 0 ) ) )
5 a r i s i n g f r o m a u s e o f ` p r i n t '
6 P o s s i b l e f i x :
7 a d d a n i n s t a n c e d e c l a r a t i o n f o r ( S h o w ( a 0 - > b 0 - > ( a 0 , b 0 ) ) )
8 I n a s t m t o f a n i n t e r a c t i v e G H C i c o m m a n d : p r i n t i t
T h e e r r o r s a y s : t h e t y p e o f ( ,
top related