Learn You Scala for Great Good!

Learn You Scala for Great Good!

Я пришел в Scala из Java. Поэтому, когда я решил немного разобраться с такими библиотеками, как Scalaz или Cats, встал вопрос более глубокого изучении принципов функционального программирования. Лучшее, что я нашел, была книга Learn You a Haskell for Great Good!

Да, чтобы разобраться в функциональном программировании для Scala, пришлось познакомиться с совершенно новым для меня языком Haskell.

Чтобы лучше разбираться в написанном, я попутно «переводил» для себя некоторые примеры на Scala (по крайней мере, там где возникали какие-то аналогии).

На случай, если кто-то пойдет по моему пути, я решил поделиться своими результатами.

Guards, guards!

Первый пример из 4 главы посвящен использованию Гардов (сейчас лень искать русский аналог этого термина) в Haskell.


    bmiTell :: (RealFloat a) => a -> a -> String  
    bmiTell weight height  
        | weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"  
        | weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"  
        | weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"  
        | otherwise                 = "You're a whale, congratulations!"  

 

Здесь создается функция, которая вычисляет коэффициент BMI (используется для определения лишнего веса) с использованием гардов (guard). Если ваш BMI меньше 18.5, то вы излишне худы. Если от 18.5 до 25.0, то вес в норме. Если выше, то у вас лишний вес. А если больше 30, то вы — кит (так написано в первоисточнике).

В коде гарды — это то, что расположено после название функции и ее аргументов и отделено вертикальными чертами (pipes). Обычно в коде им предшествует небольшой отступ. Обычно гард — это логическое выражение. Если оно истинно, то выполняется код, следующий за знаком равно после этого выражения. Если ложно, то происходит переход к следующему гарду.

Приблизительно вот так это выглядит в scala:



def rate(w:Int, h:Double):String = {
  val ratio = w/pow(h,2)
  ratio match {
    case r if r <= 18.5 => s"Underweight $r"
    case r if r <= 25 => s"Normal $r"
    case r if r <= 30 => s"Overweight! $r"
    case r => s"Whale! $r"

  }
}

println(rate(78, 1.76))

Похоже? По-моему, да. В Scala Гарды начинаются с ключевого слова if. А вместо otherwise используется паттерн без гарда. А так, код выглядит почти идентично.

 

Продолжение следует…

 

Learn You Scala for Great Good! обновлено: Ноябрь 4, 2016 автором: Alquimisto

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *