[Haskell-beginners] (.) vs ($)

Graham Gill math.simplex at gmail.com
Sat Apr 4 02:34:37 UTC 2015


readFile.head xs = readFile . (head xs)

For that to work, (head xs) must evaluate to a function with which 
readFile can compose. But that wouldn't be the type you're wanting.

readFile $ head xs = readFile (head xs)

Graham

On 03/04/2015 10:23 PM, Vale Cofer-Shabica wrote:
> Could someone please explain why the commented line fails
> spectacularly while the final line succeeds?
>
>> import System.IO (getContents)
>> import System.Environment (getArgs)
>> fileInput :: IO String
>> fileInput = getArgs>>=readFirst where
>>   readFirst :: [FilePath] -> IO String
>>   readFirst [] = System.IO.getContents
>> --readFirst xs = readFile.head xs
>>   readFirst xs = readFile $ head xs
>
> I'm particularly confused given the following typings (from ghci):
>
> readFile.head :: [FilePath] -> IO String
> readFile.head [] :: a -> IO String
>
> And this is still stranger:
>
> :type readFile.head ["foo", "bar"]
>
> <interactive>:28:16:
>      Couldn't match expected type `a0 -> FilePath'
>                  with actual type `[Char]'
>      In the expression: "foo"
>      In the first argument of `head', namely `["foo", "bar"]'
>      In the second argument of `(.)', namely `head ["foo", "bar"]'
>
> <interactive>:28:23:
>      Couldn't match expected type `a0 -> FilePath'
>                  with actual type `[Char]'
>      In the expression: "bar"
>      In the first argument of `head', namely `["foo", "bar"]'
>      In the second argument of `(.)', namely `head ["foo", "bar"]'
>
>
> Many thanks in advance,
> vale
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



More information about the Beginners mailing list