[Xmonad] xmonad-utils: small x apps for xmonad

Stefan O'Rear stefanor at cox.net
Wed Aug 22 11:16:29 EDT 2007

On Wed, Aug 22, 2007 at 12:09:21PM -0400, Gwern Branwen wrote:
>      , ((modMask .|. shiftMask, xK_g     ), spawn $ "google" ++ unsafePerformIO(getSelection))
> But notice I used unsafePerformIO. The reason is that if you try to
> simply concatenate "google" and getSelection, there's a type mismatch.
> You can then try using liftM to do it, like ("google"++) `liftM`
> getSelection, and that will work well. Unfortunately, spawn :: String
> -> X (), so spawn needs to be lifted. (The internal /bin/sh stuff
> apparently requires a String too, so it's not spawn's fault.) But if
> you go 'spawn (("google"++) `liftM` getSelection' - which on its own
> would work - the resulting type is something like IO ( X ()). And that
> just can't be allowed inside 'keys'. At least, the only solution I
> could find was to just slice the Gordian knot and avoid introducing
> the IO signature in the first place. Monads may be the greatest thing
> since sliced bread, but most of the time they're just a pain :(

It's a lot easier if you use the 'io' function, type forall a. IO a -> X a  :

spawn . ("google " ++) =<< io getSelection

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/xmonad/attachments/20070822/4bec975e/attachment.bin

More information about the Xmonad mailing list