14 marca 2013

Scala 2.10.1 wydana i hard lifting

The logo of the Scala language
Właśnie zajrzałem na stronkę scala-lang.org, aby sprawdzić, co nowego i dobrego tam podają, a tu taka niespodzianka - świeżutkie wydanie Scala 2.10.1. Nie żebym czekał specjalnie, bo nie trafiłem na niedogodności w korzystaniu z poprzednich wersji, ale kiedy proszą o pobranie, grzecznie wykonuję.

Ciekawie prezentuje się lista osób, które poświęciły swój czas na rozwój tej wersji z bardzo polskobrzmiącymi nazwiskami.
  • Grzegorz Kossakowski - tego gościa miałem okazję poznać osobiście i mam wrażenie, że wszyscy go teraz znają, więc przedstawiać nie trzeba. Sądziłem, że znajdę go na stronie zespołu TypeSafe, ale niestety nie widnieje na liście, aczkolwiek na swoim profilu na LinkedIn stoi jak byk: "Scalac hacker at Typesafe". Się Grześ zahackował i zapomnieli o nim. Chwała za zasługi!
  • Hubert Plociniczak - o nim wcześniej nie słyszałem, ale ze strony można wyczytać, że "is a member of the EPFL team working on Scala.", więc trudno się dziwić, że ma swoje miejsce na liście zasłużonych. Chwała się należy!
Ostatnie moje dokonania rozwojowe ze Scalą pozwoliły mi na rozwiązanie trudnego zadania z książki Functional Programming in Scala, którą żyję prawie każdego dnia i jestem nią wprost zachwycony. Nieskromnie napiszę, że nie mniej niż swoimi dokonaniami przy jej aktywnym udziale. Przeczytałem ją tyle razy, że mógłbym ją teraz sam napisać.

"Exercises, answers, and hints to go along with the book "Functional Programming in Scala" znajdują się na GitHubie i można samodzielnie popróbować się z funkcyjnymi problemami w Scali.

Oto rozwiązanie pierwszego zadania oznaczonego jako Hard z rozdziału 2. Świadomie nie podaję treści zadania, bo liczę, że wszystko zaszyte jest w sygnaturze. Kto odgadnie, do czego służy funkcja lift3? Niezły mind twister.
object MyModule { 
  def lift[A,B,C,D](f: (B, C) => D)

                   (g: A => B,
                    h: A => C): A => D =
    a => f(g(a), h(a))

  // Exercise 11
  def lift3[A,B,C,D,E](f: (B, C, D) => E)
                      (g: A => B,
                       h: A => C,
                       i: A => D): A => E =
    a => {val f2: (C,D) => E = f(g(a),_,_)
          lift(f2)(h, i)(a)}
}
Początkowo zadanie mnie przygniotło, ale ostatecznie dałem sobie radę i to bez żadnych ściągawek (!) Wystarczyło dokładniej doczytać książkę i...pomyśleć. Jak zwykle zresztą. Teraz Twoja kolej.