<div dir="ltr">It works! And I don't understand it! Particularly this line:<br><br>  inputs <- map (\e -> [hfill $ widget e]) <$> varGet myVar<br><br>I'm considering the type signatures:<br>  map :: (a -> b) -> [a] -> [b] <br>  (<$>) :: Functor f => (a -> b) -> f a -> f b<br>  varGet :: Var a -> IO a<br>map and <$> (fmap) are nearly synonymous; map seems like a special case of fmap. I gather the fmap must be to map inside the IO type that varGet returns, and the map must be mapping across some list. But what about their function arguments? Is map using the lambda expression, or is fmap? What function argument is the other one using? Are they both somehow sharing the lambda expression?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 31, 2015 at 12:48 AM, Henk-Jan van Tuyl <span dir="ltr"><<a href="mailto:hjgtuyl@chello.nl" target="_blank">hjgtuyl@chello.nl</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, 31 Mar 2015 04:14:35 +0200, Jeffrey Brown <<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>> wrote:<br>
<br>
:<span class=""><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I am trying to modify Layout.hs [1] to permit a variable number, rather<br>
than a fixed number, of text entry boxes. I shrank the program, mostly by<br>
removing features, until it was this:<br>
<br>
  main = start $ do<br>
    f      <- frame  [text := "Layout test"]<br>
    p      <- panel  f []<br>
    xinput <- textEntry p [text := "100"]<br>
    yinput <- textEntry p [text := "100"]<br>
    myVar <- varCreate [xinput,yinput]<br>
    set f [ layout := container p $ margin 10 $<br>
      column 5 [boxed "coordinates" (grid 5 5<br>
          [[hfill $ widget xinput], [hfill $ widget yinput]] -- replacing<br>
        ) ] ]<br>
    return ()<br>
<br>
I want to replace the line marked "replacing". Rather than hard-coding the<br>
number of text entry boxes (2), I want it to deal with a mutable collection<br>
of them, in myVar.<br>
<br>
I tried this:<br>
  [ fmap (\e -> hfill $ widget e) $ varGet myVar ]<br>
</blockquote></span>
:<br>
<br>
The result of varGet is of type "IO something", you must convert that to "something", by using "<-". You can do this by adding the line:<br>
  inputs <- map (\e -> [hfill $ widget e]) <$> varGet myVar<br>
before the set command (note the square brackets). The <$> operator is from module Data.Functor and is defined as<br>
  (<$>) = fmap<br>
<br>
The main function becomes this:<span class=""><br>
  main = start $ do<br>
      f      <- frame  [text := "Layout test"]<br>
      p      <- panel  f []<br>
      xinput <- textEntry p [text := "100"]<br>
      yinput <- textEntry p [text := "100"]<br>
      myVar  <- varCreate [xinput, yinput]<br></span>
      inputs <- map (\e -> [hfill $ widget e]) <$> varGet myVar<span class=""><br>
      set f [ layout := container p $ margin 10 $<br></span>
              column 5 [boxed "coordinates" (grid 5 5 inputs)]<br>
            ]<br>
      return ()<br>
<br>
<br>
Regards,<br>
Henk-Jan van Tuyl<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
-- <br>
Folding@home<br>
What if you could share your unused computer power to help find a cure? In just 5 minutes you can join the world's biggest networked computer and get us closer sooner. Watch the video.<br>
<a href="http://folding.stanford.edu/" target="_blank">http://folding.stanford.edu/</a><br>
<br>
<br>
<a href="http://Van.Tuyl.eu/" target="_blank">http://Van.Tuyl.eu/</a><br>
<a href="http://members.chello.nl/hjgtuyl/tourdemonad.html" target="_blank">http://members.chello.nl/<u></u>hjgtuyl/tourdemonad.html</a><br>
Haskell programming<br>
--<br>
</font></span></blockquote></div><br></div>