Haskell Book

Embed Size (px)

Citation preview

  • 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:[email protected]
  • 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 ( ,