<div>Thank you Daniel, this helps a lot !<br></div><div><br></div><div>As you can guess, I come from the imperative world, but want to discover functionnal languages (thanks to xmonad).</div><div><br></div><div>Thank you very much for your explainations. I think I will fall in that trap again, but next time, I should be able to fix it myself. I still don&#39;t understand exactly what lies behind, but start to get the picture. I didn&#39;t change anything besides the position of the &#39;do&#39; and the deletion of the &#39;return ()&#39;.</div>

<div>I will modify the code with the realWork function as you suggested. I looks much nicer.</div><div><br></div><div>As of the last problem, with the intToDigit function. I already knew about the bug. I actually knew it wouldn&#39;t work since it is takes only argument from 0 to 15... Well, that was lazy from me. I just wanted to write the statement so that I don&#39;t forget it.</div>

<div><br></div><div>Danke sehr.</div><div><br></div><div><br></div><br><div class="gmail_quote">2010/2/26 Daniel Fischer <span dir="ltr">&lt;<a href="mailto:daniel.is.fischer@web.de">daniel.is.fischer@web.de</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Am Freitag 26 Februar 2010 18:34:35 schrieb Florian Duret:<br>
<div class="im">&gt; It seems that both your suggestions have worked ! Thank you very much.<br>
&gt; But I still can&#39;t figure out what went wrong.<br>
<br>
</div>Did you change anything besides removing the &quot;do&quot; and &quot;return ()&quot; from the<br>
then-branch and insert the &quot;do&quot; in the else-branch?<br>
If not, you&#39;ve been bitten by a somewhat less than obvious aspect of layout<br>
- although it&#39;s pretty clear with an explanation.<br>
A new layout-block isn&#39;t opened by a larger indentation, but by the<br>
keywords do, let, of and where.<br>
So, when you write<br>
<br>
... = do<br>
  xxx<br>
  if blah<br>
    then do<br>
      foo<br>
      bar<br>
    else<br>
      baz<br>
      zap<br>
<br>
the &quot;do&quot; after the then opens a new layout-block inside the big do-block,<br>
since you didn&#39;t insert an explicit  brace. The indentation level thereof<br>
is determined by the &#39;f&#39; of &quot;foo&quot;, bar is indented to the same level as<br>
foo, so it&#39;s a new expression in that same block.<br>
The else is indented less than the foo, so that ends the inner layout-block<br>
and we return to the layout-block of the big do-block. The indentation<br>
level thereof is determined by the first &#39;x&#39;, and the &quot;if&quot; is indented to<br>
the same level.<br>
The else, the baz and the zap are all indented further than the if, so they<br>
all belong to the if-expression (as intended).<br>
But since there&#39;s no &quot;do&quot; after the &quot;else&quot;, all that is on one logical<br>
line, it&#39;s parsed as<br>
<br>
... = do<br>
  xxx<br>
  if blah then do { foo; bar } else baz zap<br>
<br>
Not what was intended, but it parses just fine.<br>
<br>
Now you didn&#39;t have<br>
<br>
      baz<br>
      zap<br>
<br>
but<br>
<br>
      baz &lt;- bong<br>
      zap<br>
<br>
and since we&#39;re still having only one logical line for the if-expression,<br>
the parser sees that as<br>
<br>
... = do<br>
  xxx<br>
  if blah then do { foo; bar } else baz &lt;- bong zap<br>
<br>
But the syntax is<br>
<br>
  pattern &lt;- expression<br>
<br>
so the parser tries to parse<br>
<br>
  if blah then do { foo; bar } else baz<br>
<br>
as a pattern. But it doesn&#39;t conform to the pattern productions, hence the<br>
parse error.<br>
<div class="im"><br>
&gt;<br>
&gt; My initial goal was to keep the minimum inside the if ... then ... else<br>
&gt; statement. Basically, if the list is empty, then stop. If not, then<br>
&gt; assign the argument to sacFile1, and go on with the rest.<br>
<br>
</div>It would be cleanest to have<br>
<br>
realWork :: FileName -&gt; IO ()<br>
realWork file = do<br>
    sacFile1 &lt;- openBinaryFile file ReadMode<br>
    ...<br>
<br>
main :: IO ()<br>
main = do<br>
    argList &lt;- getArgs<br>
    case argList of<br>
      []    -&gt; putStrLn &quot;No filename ...&quot;<br>
      (f:_) -&gt; realWork f<br>
<br>
or<br>
<br>
    if null argList<br>
      then putStrLn &quot;...&quot;<br>
      else realWork (head argList)<br>
<br>
, je pense.<br>
<div class="im"><br>
&gt;<br>
&gt; Here is what it looks like now:<br>
&gt; module Main () where<br>
&gt;<br>
&gt; import System.IO<br>
&gt; import System.Environment(getArgs)<br>
&gt; import Data.Char(intToDigit)<br>
&gt;<br>
&gt; import SAC_Type<br>
&gt; import SAC_IO<br>
&gt;<br>
&gt; main :: IO()<br>
&gt; main = do<br>
&gt;      -- On commence par ouvrir le fichier SAC en mode binaire<br>
&gt;      argsList &lt;- getArgs<br>
&gt;      if (null argsList)<br>
&gt;         then<br>
&gt;               putStrLn $ &quot;No filename given to the program.\n $<br>
&gt; ProgramName file.sac&quot;<br>
&gt;         else do<br>
&gt;            sacFile1 &lt;- openBinaryFile (head argsList) ReadMode<br>
&gt;<br>
&gt;            position &lt;- hTell sacFile1<br>
&gt;            putStrLn $ &quot;Position 1: &quot; ++ [intToDigit( fromInteger<br>
&gt; (position) )]<br>
&gt;<br>
&gt;            hSeek sacFile1 AbsoluteSeek 440<br>
&gt;            position2 &lt;- hTell sacFile1<br>
&gt;            putStrLn $ &quot;Position 2: &quot; ++ [intToDigit( fromInteger<br>
&gt; (position2) )]<br>
<br>
</div>I don&#39;t think that&#39;s what you really want:<br>
<br>
Prelude Data.Char&gt; intToDigit 440<br>
*** Exception: Char.intToDigit: not a digit 440<br>
<br>
perhaps you wanted<br>
<br>
        putStrLn $ &quot;Position 2: &quot; ++ show position2<br>
<div><div class="h5"><br>
?<br>
<br>
&gt;<br>
&gt;            -- A la fin, il faut evidemment le fermer<br>
&gt;            hClose sacFile1<br>
&gt;<br>
&gt;<br>
&gt; Thank you, Danke, 谢谢, merci, etc...<br>
<br>
</div></div></blockquote></div><br>