On Mon, Oct 5, 2009 at 9:48 AM, Maria Boghiu <maria.bog...@gmail.com> wrote:
Hey.

I'm trying to configure Xmonad, the window manager.

for this purpose, I'm trying to read the workspaces variable in the code
below from file.
As you can see, I do workspaces = readWS where

readWS = do
         l <- readFile "~/bla"
         return l

I get an error saying I am mismatching types IO [String] and [String].
But I thought that once one does l <- readFile "~/bla", l is the a string
or, in this case, a String list. If I run that line in prelude it seems to
be working fine, prints the content of the file "~/bla" on screen (though
I'm not sure if as a String or as a list of Strings, i.e. [String])

Can anyone help please?
I've been struggling with this for days...

94 main = do
 95         xmonad
 96         $ defaultConfig {
 97         manageHook         = manageDocks <+> myManageHook <+> manageHook
defaultConfig,
 98         layoutHook         = avoidStruts $ layoutHook defaultConfig,
 99         logHook            = dynamicLogWithPP $ conkyPP "",
100         terminal           = "gnome-terminal",
101         keys               = myKeys,
102         workspaces         = readWS,
103         mouseBindings      = myMouseBindings,
104         focusedBorderColor = "#008E00",
105         borderWidth        = 3
106         --modMask            = mod1Mask, --This is to rebind mod key
107         } `additionalKeys`

A quick tip: when GHC gives you a compile error like that, it's because you've 
made an error where 'what I say' is not 'what I [want to] do'. In this case, 
you're *saying* 'use readFile, which returns a String', and *doing* 'ok, here, 
use this [String]'.

The way to know that it's an issue is to find out what type readFile is; in ghci you 
can do ':type readFile' and it'll tell you String -> IO String. Now you know 
workspaces needs [String], so you need something which goes 'String -> [String]'. 
If you don't already know that that is 'lines', then you can ask Hoogle 
http://www.haskell.org/hoogle/  that question: 
http://www.haskell.org/hoogle/?hoogle=String+-%3E+[String] and it will give you as 
the first hit exactly what you need. (Hoogle is great for beginners who don't know 
the libraries.)

Obviously, this is a real issue; there's no way the compiler could possibly figure 
out what the right thing to do because there are so many ways to do 
String->[String] (just consider the specific example of 'lines' - how does it 
handle Windows v Unix line-endings?). So you have to tell it.

The monad issue with the difference between IO [String] and [String] I will 
leave to others to explain. :)

--
gwern

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to