Hi,

Write firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] ++ " otherbit " ++ xs

Nadav

 

 

From: haskell-bounces@haskell.org [mailto:haskell-bounces@haskell.org] On Behalf Of Angus Comber
Sent: Wednesday, April 03, 2013 12:01 PM
To: Haskell Mailing List
Subject: [Haskell] Haskell [x] and x notation - as-pattern example

 

I am reading Learn you a Haskell for great good and on page 40 - as-patterns.

 

I have changed the example slightly to be:

 

firstLetter :: String -> String

firstLetter "" = "Empty string, oops"

firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x] ++ " otherbit " ++ xs

Then can use like this:

 

*Main> firstLetter "Qwerty"

"The first letter of Qwerty is Q otherbit werty"

But I was confused about the difference between [x] and x and why I have to use [x] in the above example.

 

For example if I change to

 

firstLetter :: String -> String

firstLetter "" = "Empty string, oops"

firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ x ++ " otherbit " ++ xs

I get error:

 

Couldn't match expected type `[Char]' with actual type `Char'

In the first argument of `(++)', namely `x'

In the second argument of `(++)', namely `x ++ " otherbit " ++ xs'

In the second argument of `(++)', namely

  `" is " ++ x ++ " otherbit " ++ xs'

I can use xs to print "werty" but have to use [x] to print "Q". Why is that?

 

What does [x] mean?

 

In the (x:xs) : just delimits each element. so x is the first element. Why can I not print by using x?

 

Also xs is of what type? list of values? So does this mean x is an element and xs must be of type list? Confused...