- vừa được xem lúc

[Declarative Programming + Elm] Bài 8 - Conditional Expression & Let Bindings

0 0 24

Người đăng: Semi Art

Theo Viblo Asia

Sau khi viết lại chương trình sumNumberArray bằng JS thì mình mới nhận ra rằng, cú pháp Pattern Matching rất gọn gàng nhưng cũng có giới hạn nhất định. Đó là cú pháp này không thể thực hiện việc kiểm tra định lượng của dữ liệu bằng các phép nhận định so sánh <, ==, >, v.v... Vì vậy nên chúng ta sẽ cần ghi chú thêm một cú pháp khác nữa có tên gọi là biểu thức điều kiện Conditional Expression.

cd Documents && cd learn-elm
elm reactor

Conditional Expression

Nghe tên gọi đã thấy quen thuộc rồi. Chắc chắn là có liên quan tới if..else. Tuy nhiên chúng ta cần lưu ý rằng đây là biểu thức expression chứ không phải là cấu trúc lệnh structure. Logic hoạt động ở đây là dựa trên điều kiện của dữ liệu để chọn giá trị trả về, chứ không phải là chọn câu lệnh để thực hiện.

module Tell exposing ( age , point , list , any , day ) age : Int -> String
age n = if (n <= 12) then "Being built by Heaven" else if (n <= 21) then "Unpacking old Story" else if (n < 101) then "Learning new Lessons" else "Finished Learning" -- point : ...
module Main exposing (main)
import Html exposing (..)
import Tell exposing (..) main : Html message
main = Html.text <| (Tell.age 1001)

http://localhost:8000/src/Main.elm

Let Bindings

Ngoài ra thì chúng ta còn có thêm một cú pháp binding để có thể đưa ra một biểu thức trả về ngắn gọn với các tên định danh hoàn toàn mới so với các tham số - sau đó gắn kèm các định nghĩa giải thích cho các tên định danh đó.

module Tell exposing ( boxVolume , age , position , list , any , day ) boxVolume : Float -> Float -> Float -> Float
boxVolume a b height = let area = a * b in area * height -- age : ...
-- ...
main = Html.text <| String.fromFloat <| (Tell.boxVolume 5.1 6.9 7.2)

http://localhost:8000/src/Main.elm

Thực tế thì cú pháp này trông khá Imperative, tuy nhiên lại là lựa chọn binding duy nhất trong Elm. Ở một ngôn ngữ khác có tên gọi là Haskell người ta thường dùng cú pháp có chiều viết diễn giải ngược lại như thế này:

boxVolume a b c = area * c where area = a * b

Lối viết diễn dịch với biểu thức kết quả được đặt cùng dòng với biểu thức định nghĩa sub-program ở phía bên trái sẽ giúp chúng ta có thể tách lấy thông tin định nghĩa tổng quát của sub-program rất nhanh trong dòng đầu tiên. Sau đó, nếu thực sự cần thiết, chúng ta có thể tiếp tục đọc các dòng binding thông tin giải thích cho các yếu tố xuất hiện trong biểu thức ban đầu.

Thôi thì ở môi trường nào có công cụ gì thì chúng ta sẽ tận dụng công cụ đó. Cứ sử dụng cú pháp let..in nhiều rồi cũng sẽ quen. Cứ tìm đọc biểu thức in.. trước vậy. Tuy nhiên do đó nên chúng ta phải lưu ý không nên viết nhiều biểu thức let..in xếp chồng trong cùng một đoạn code định nghĩa. Bởi vì như vậy sẽ rất khó để tổng quát thông tin khi đọc. Tốt nhất là chúng ta chỉ nên có một cặp let..in và có thể có nhiều biểu thức cùng cấp đứng sau let để giải thích cho các yếu tố cần thiết.

module Tell exposing ( cylinderVolume , boxVolume , age , position , list , any , day ) cylinderVolume : Float -> Float -> Float
cylinderVolume radius height = let sideArea = 2 * pi * radius * height topArea = pi * radius ^ 2 in sideArea + 2 * topArea -- boxVolume : ...
-- ...
main = Html.text <| String.fromFloat <| (Tell.cylinderVolume 1.0 9.0)

http://localhost:8000/src/Main.elm

Conditional Expression in JS

// -- main : any -> null
const main = (_) => console.log (tellAge (1001)) // -- tellAge : number -> string
const tellAge = (age) => (age <= 12) ? "Being built by Heaven" : (age <= 21) ? "Unpacking old Story" : (age < 101) ? "Learning new Lessons" : "Finished Learning" // -- start program
main (Infinity)

(chưa đăng tải) [Declarative Programming + Elm] Bài 9 - ...

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 67

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 47

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 41

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 75

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 280

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 50