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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe