Cans inside Cans says "Use a for comprehension" to me:
for (r <- S.request; loc <- r.location; link <- loc.createDefaultLink) yield
link.text
It's a few more characters, but IMHO, more readable.
On Wed, Oct 15, 2008 at 7:14 PM, Charles F. Munat <[EMAIL PROTECTED]> wrote:
>
> Yes, this does help a bit.
>
> I actually understand the Can (and Option) very well, and I think it's a
> great idea (though the added advantage of the Can doesn't seem to be
> heavily used yet).
>
> The problem I was having was dealing with cans inside cans inside cans.
> But after reading everything everyone sent, I think I've got it now:
>
> val p =
> S.request.flatMap(_.location).flatMap(_.createDefaultLink).map(_.text)
>
> <a href={p.openOr("")}>This page</a>
>
> Or this:
>
> val p = for (req <- S.request;
> loc <- req.location;
> txt <- loc.createDefaultLink) yield txt
>
> <a href={p.openOr("").toString}>This page</a>
>
> Of course, now that I know, I'll just use S.uri.
>
> Thanks again for all the help!
>
> Chas.
>
> David Pollak wrote:
> > Charles,
> >
> > A Can is a container... it can contain a thing or be empty.
> >
> > You can transform the contents of a Can from one thing to another using
> > map(). map() on Can, Option, List is exactly the same as map() on Array
> > in Ruby:
> > irb(main):004:0> [1,2,3].map{|v| v.to_s + " Cats"}
> > => ["1 Cats", "2 Cats", "3 Cats"]
> >
> > This is just like in Scala:
> > scala> List(1,2,3).map(v => v.toString + " Cats")
> > res0: List[java.lang.String] = List(1 Cats, 2 Cats, 3 Cats)
> >
> > In Ruby, when you access the first element of an Array that has no
> > elements, you get 'nil' back. In Scala, you get an exception. This
> > allows you to tell the difference between [nil][0] and [][0] which are
> > the same in Ruby.
> >
> > The most syntactically pleasing way of extracting things from List, Can,
> > Option in Scala is the "for" comprehension:
> >
> > scala> for (a <- Some(3);
> > | b <- Some(4)) yield a * b
> > res1: Option[Int] = Some(12)
> >
> >
> > Does that help?
> >
> > Thanks,
> >
> > David
> >
> >
> >
> > Charles F. Munat wrote:
> >> Thanks. I have read everything I could find on this but I think I'm just
> >> a bit dense about it. Probably, it's just unfamiliarity with the syntax
> >> of Scala as a whole and functional programming in general (or maybe I'm
> >> just stupid). Hopefully, at some point the light bulb will come on and
> >> this will seem easy. I'll read the blog post.
> >>
> >> Chas.
> >>
> >> David Pollak wrote:
> >>
> >>> Please also see:
> >>>
> http://blog.lostlake.org/index.php?/archives/50-The-Scala-Option-class-and-how-lift-uses-it.html
> >>>
> >>> Can[T] is just like Option[T]
> >>>
> >>> Marius wrote:
> >>>
> >>>> to get stuff out of a can you can do:
> >>>>
> >>>> 1. Pattern matching
> >>>>
> >>>> having c a Can[String]
> >>>>
> >>>> c match {
> >>>> case Full(value) => //do something with the value
> >>>> case _ =>
> >>>> }
> >>>>
> >>>> 2. call open_!(if you're sure your can is not empty) or openOr
> >>>>
> >>>> Br's,
> >>>> Marius
> >>>>
> >>>> On Oct 15, 3:22 am, "Charles F. Munat" <[EMAIL PROTECTED]> wrote:
> >>>>
> >>>>
> >>>>> I must be very dense, but these cans are kicking my butt (kicking my
> >>>>> can?). No matter what I do, I seem to end up with everything back in
> the
> >>>>> can! I just... want... to get... the goodies... OUT!
> >>>>>
> >>>>> An example:
> >>>>>
> >>>>> How do I extract the URI of the current page from S.request?
> >>>>>
> >>>>> I am currently doing something immensely stupid and wrong like this:
> >>>>>
> >>>>>
> S.request.toList.head.location.toList.head.createDefaultLink.toList.head.text
> >>>>>
> >>>>> I *know* this is way wrong, but I'm not clever enough, apparently, to
> >>>>> figure out the puzzle, despite reading through the Can code
> repeatedly.
> >>>>> I figure the above works only because what I'm looking for is there,
> >>>>> which sort of defeats the purpose of the cans...
> >>>>>
> >>>>> Can anyone help? This is driving me insane.
> >>>>>
> >>>>> Chas.
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>
> >>
> >>
> >
> > >
>
> >
>
--
Lift, the simply functional web framework http://liftweb.net
Collaborative Task Management http://much4.us
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---