lập trình hàm trong Scala – functional programming

Scala là một ngôn ngữ dị nhất mà tôi từng làm việc. Để học nó tôi phải mất nhiều thời gian hơn C++ (phần generic programming khá khó), hay C# (dễ), Java (quá thân quen) hay Objective-C (khá giống với C).

  • Lập trình hàm ~ Functional Programming
  • Hướng đối tượng rất mềm dẻo (trait)
  • Cú pháp không dùng dot notation (object.method ~ đối-tượng.phương-thức)
  • Xu hướng đặt tên biến ngắn gọn
  • Không dùng ; để kết thúc một lệnh như C++, C, Java, C#.
  • Vừa là ngôn ngữ biên dịch vừa là ngôn ngữ REPL (gõ trực tiếp, xử lý từng dòng lệnh)

Function ~ Hàm: giống thủ tục vì nó cũng là nhóm các lệnh, nhưng nó có thể hoạt động như biến, hoặc kiểu. Function có thể bị gán qua lại giữa các đối tượng, hoặc thậm chí hàm khác nhau. Hàm có thể được khai báo trong hàm, trong phương thức hoặc khai báo vô danh (anonymous function).

Ký hiệu => có thể hiểu rằng, function sẽ biến đổi từ các tham số đầu vào (parameters) thành nhóm các lệnh kết hợp với kết quả trả về.
A => B hay A => Function

Ví dụ Function Programming trong Scala:

//Định nghĩa hàm

– scala> val x2 = (i : Int) => { i * 2}

x2: Int => Int = <function1>

//Gọi hàm

-scala> x2(5)

=>res2: Int = 10

//Nối hàm

-scala> x2(5).toString

=>res3: String = 5

//Định nghĩa hàm nhận vào 1 tham số String, trả về String khác đã upper case

– scala> val uString = (txt: String) => {txt.toUpperCase} uString: String => String = <function1>

//Thử với một chuỗi đơn giản

-scala> uString(“hellword”)

=>res4: String = HELLLWORD

//Thao tác từng phần tử trong một

List val list = List(“Toan”, “Ly”, “Hoa”, “Sinh”, “Anh”)

list.map(uString)

=>res5: List[String] = List(TOAN, LY, HOA, SINH, ANH)

1.Khai báo hàm với kiểu trả về tự suy và tường minh

val f = (i: Int) => { i % 2 ==0 } //tham số vào là i: Int, kiểu trả về tự hiểu ngầm là Boolean

val f: (Int) => Boolean = i => {i % 2 ==0} //Kiểu trả về tường minh là Boolean

val f: Int => Boolean = i => {i % 2 ==0} //Bỏ ngoặc () quanh tham số vào

val f: Int => Boolean = i => i % 2 ==0 //Bỏ ngoặc {} nếu thân hàm chỉ có 1 lệnh

val f: Int => Boolean = i => {_ % 2 ==0} //Thay i bằng biến tượng trưng 

2.kiểm tra số chia hết cho 2 mà đã có 5 cách viết

//Đầu vào 2 tham số String, nối lại rồi chuyển sang Integer
scala> val f = (txt1: String, txt2: String) => {
     | val txt = txt1.concat(txt2)
     | txt.toInt}
f: (String, String) => Int = <function2>

scala> f("1", "0")
res8: Int = 10

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s