Personal tools

Common Misunderstandings

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Common mistakes by newbies)
 
m
Line 8: Line 8:
 
if-then statements must always include an 'else' portion. It might be best not to think of if-then-else as flow control, as in most imperative languages, but think of it as construction of a value using a well formed expression.
 
if-then statements must always include an 'else' portion. It might be best not to think of if-then-else as flow control, as in most imperative languages, but think of it as construction of a value using a well formed expression.
   
[code]
+
<code>
 
x = b ? y : z;
 
x = b ? y : z;
[/code]
+
</code>
   
 
The above is valid, though not common, C code. It states that if '''b''' is true then '''x = y''' otherwise '''x = z'''. Notice how this makes no sense without '''z''':
 
The above is valid, though not common, C code. It states that if '''b''' is true then '''x = y''' otherwise '''x = z'''. Notice how this makes no sense without '''z''':
   
[code]
+
<code>
 
x = b ? y;
 
x = b ? y;
[/code]
+
</code>
   
 
What is '''x''' when '''b''' is false? One should also recognize that the types returned by the '''then''' and '''else''' branches must match due to Haskells strong and static type system.
 
What is '''x''' when '''b''' is false? One should also recognize that the types returned by the '''then''' and '''else''' branches must match due to Haskells strong and static type system.
Line 22: Line 22:
 
When '''if''' is used for sequencing IO it is not uncommon to see an '''else''' that returns a null value:
 
When '''if''' is used for sequencing IO it is not uncommon to see an '''else''' that returns a null value:
   
[code]
+
<haskell>
 
main = do
 
main = do
 
startNetwork <- askUser "Network? "
 
startNetwork <- askUser "Network? "
Line 29: Line 29:
 
handlePackets iface
 
handlePackets iface
 
else return ()
 
else return ()
[/code]
+
</haskell>
   
 
== '''do''' Notation ==
 
== '''do''' Notation ==

Revision as of 03:59, 22 February 2008

Contents

1 Common Mistakes and Incorrect Beliefs By Haskell Beginners

People going from zero to Haskell likely gain a misunderstanding or miss a point that isn't stressed enough. Here are some mistakes that have been observed from multiple sources.

1.1 Indentation

Perhaps the first trip-up - you might understand that indentation defines where a code block starts and the lack of an equal amount of indentation indicates the previous code block ended. What some miss is that then' and else must be indented deeper than the if statement (unless .

1.2 If / Then / Else

if-then statements must always include an 'else' portion. It might be best not to think of if-then-else as flow control, as in most imperative languages, but think of it as construction of a value using a well formed expression.

x = b ? y : z;

The above is valid, though not common, C code. It states that if b is true then x = y otherwise x = z. Notice how this makes no sense without z:

x = b ? y;

What is x when b is false? One should also recognize that the types returned by the then and else branches must match due to Haskells strong and static type system.

When if is used for sequencing IO it is not uncommon to see an else that returns a null value:

main = do
    startNetwork <- askUser "Network? "
    if startNetwork
        then do iface <- initNetworkInterface
                handlePackets iface
        else return ()

1.3 do Notation

If the do notation page ever exists I'll advice you to check it out. Until then, understand that a missing 'do' from the top of a function or code block can result in your compiler giving an error message citing a must later line number. Also, any new blocks (ex: from an if or case) must have their own 'do', even if the higher level code block already had one.

This certainly isn't the full picture - for an inverse point of view see do notation considered harmful.