<div dir="ltr"><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">To reiterate what others have said,</font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></span></div><div><font face="monospace, monospace"><span style="font-size:12.8000001907349px">   readFile . head xs</span><br></font></div><div><font face="monospace, monospace"><span style="font-size:12.8000001907349px">==</span><span style="font-size:12.8000001907349px"> readFile . (head xs)</span><span style="font-size:12.8000001907349px">     { function application binds strongest }</span></font></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">== (.) readFile (head xs)   { operators are also functions }</font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">The types,</font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">   (.)      :: (b -> c) -> (a -> b) -> (a -> c)</font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">   readFile :: FilePath -> IO String</font></span></div><div><span style="font-size:12.8000001907349px"><font face="monospace, monospace">   head xs  :: FilePath</font></span></div><div><span style="font-family:monospace,monospace;font-size:12.8000001907349px"><br></span></div><div><span style="font-family:monospace,monospace;font-size:12.8000001907349px">This cannot work as the types don't match. On the other hand, using ($) instead of (.) will work.</span></div><div><span style="font-family:monospace,monospace;font-size:12.8000001907349px">Try writing that out and reasoning with the types on pen and paper, as an exercise.</span></div><div><span style="font-family:monospace,monospace;font-size:12.8000001907349px"><br></span></div><div><span style="font-family:monospace,monospace;font-size:12.8000001907349px">If you're interested, there is an excellent post about equational reasoning here: </span><font face="monospace, monospace"><span style="font-size:12.8000001907349px"><a href="http://www.haskellforall.com/2013/12/equational-reasoning.html">http://www.haskellforall.com/2013/12/equational-reasoning.html</a></span></font></div><div><font face="monospace, monospace"><span style="font-size:12.8000001907349px"><br></span></font></div><div><font face="monospace, monospace"><span style="font-size:12.8000001907349px">Enjoy :)</span></font></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 4 April 2015 at 08:10, Mike Meyer <span dir="ltr"><<a href="mailto:mwm@mired.org" target="_blank">mwm@mired.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">As is often the case with Haskell, your answer is in the types:<div><br></div>Prelude> :t ($)<br>($) :: (a -> b) -> a -> b<br>Prelude> :t (.)<br>(.) :: (b -> c) -> (a -> b) -> a -> c<div><br></div><div>So $ takes a function and applies it to a value. . takes two functions and composes them and applies the result to a value.</div><div><br></div><div>So <span style="font-size:12.8000001907349px">readFirst xs = (readFile.head) xs, or just readFirst = readFile . head. But readFirst xs = (readFile $ head) xs will also fail, because readFile doesn't work on objects of type head.</span></div><div><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 3, 2015 at 9:23 PM, Vale Cofer-Shabica <span dir="ltr"><<a href="mailto:vale.cofershabica@gmail.com" target="_blank">vale.cofershabica@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Could someone please explain why the commented line fails<br>spectacularly while the final line succeeds?<br><br>>import System.IO (getContents)<br>>import System.Environment (getArgs)<br><br>>fileInput :: IO String<br>>fileInput = getArgs>>=readFirst where<br>>  readFirst :: [FilePath] -> IO String<br>>  readFirst [] = System.IO.getContents<br>>--readFirst xs = readFile.head xs<br>>  readFirst xs = readFile $ head xs<br><br><br>I'm particularly confused given the following typings (from ghci):<br><br>readFile.head :: [FilePath] -> IO String<br>readFile.head [] :: a -> IO String<br><br>And this is still stranger:<br><br>:type readFile.head ["foo", "bar"]<br><br><interactive>:28:16:<br>    Couldn't match expected type `a0 -> FilePath'<br>                with actual type `[Char]'<br>    In the expression: "foo"<br>    In the first argument of `head', namely `["foo", "bar"]'<br>    In the second argument of `(.)', namely `head ["foo", "bar"]'<br><br><interactive>:28:23:<br>    Couldn't match expected type `a0 -> FilePath'<br>                with actual type `[Char]'<br>    In the expression: "bar"<br>    In the first argument of `head', namely `["foo", "bar"]'<br>    In the second argument of `(.)', namely `head ["foo", "bar"]'<br><br><br>Many thanks in advance,<br>vale<br>_______________________________________________<br>Beginners mailing list<br><a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br></blockquote><div><br></div></div></div></div></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 3, 2015 at 9:23 PM, Vale Cofer-Shabica <span dir="ltr"><<a href="mailto:vale.cofershabica@gmail.com" target="_blank">vale.cofershabica@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Could someone please explain why the commented line fails<br>
spectacularly while the final line succeeds?<br>
<br>
>import System.IO (getContents)<br>
>import System.Environment (getArgs)<br>
<br>
>fileInput :: IO String<br>
>fileInput = getArgs>>=readFirst where<br>
>  readFirst :: [FilePath] -> IO String<br>
>  readFirst [] = System.IO.getContents<br>
>--readFirst xs = readFile.head xs<br>
>  readFirst xs = readFile $ head xs<br>
<br>
<br>
I'm particularly confused given the following typings (from ghci):<br>
<br>
readFile.head :: [FilePath] -> IO String<br>
readFile.head [] :: a -> IO String<br>
<br>
And this is still stranger:<br>
<br>
:type readFile.head ["foo", "bar"]<br>
<br>
<interactive>:28:16:<br>
    Couldn't match expected type `a0 -> FilePath'<br>
                with actual type `[Char]'<br>
    In the expression: "foo"<br>
    In the first argument of `head', namely `["foo", "bar"]'<br>
    In the second argument of `(.)', namely `head ["foo", "bar"]'<br>
<br>
<interactive>:28:23:<br>
    Couldn't match expected type `a0 -> FilePath'<br>
                with actual type `[Char]'<br>
    In the expression: "bar"<br>
    In the first argument of `head', namely `["foo", "bar"]'<br>
    In the second argument of `(.)', namely `head ["foo", "bar"]'<br>
<br>
<br>
Many thanks in advance,<br>
vale<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div>Regards</div><div dir="ltr"><div><br></div><div>Sumit Sahrawat</div></div></div></div></div></div></div>
</div>