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
.
1 2 3 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">module</span> <span class="token constant">Tell</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token hvariable">age</span> <span class="token punctuation">,</span> <span class="token hvariable">point</span> <span class="token punctuation">,</span> <span class="token hvariable">list</span> <span class="token punctuation">,</span> <span class="token hvariable">any</span> <span class="token punctuation">,</span> <span class="token hvariable">day</span> <span class="token punctuation">)</span> <span class="token hvariable">age</span> <span class="token operator">:</span> <span class="token constant">Int</span> <span class="token operator">-></span> <span class="token constant">String</span> <span class="token hvariable">age</span> <span class="token hvariable">n</span> <span class="token operator">=</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token hvariable">n</span> <span class="token operator"><=</span> <span class="token number">12</span><span class="token punctuation">)</span> <span class="token keyword">then</span> <span class="token string">"Being built by Heaven"</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token hvariable">n</span> <span class="token operator"><=</span> <span class="token number">21</span><span class="token punctuation">)</span> <span class="token keyword">then</span> <span class="token string">"Unpacking old Story"</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token hvariable">n</span> <span class="token operator"><</span> <span class="token number">101</span><span class="token punctuation">)</span> <span class="token keyword">then</span> <span class="token string">"Learning new Lessons"</span> <span class="token keyword">else</span> <span class="token string">"Finished Learning"</span> <span class="token comment">-- point : ...</span> |
1 2 3 4 5 6 7 | <span class="token keyword">module</span> <span class="token constant">Main</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span><span class="token hvariable">main</span><span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span><span class="token operator">..</span><span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Tell <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span><span class="token operator">..</span><span class="token punctuation">)</span> <span class="token hvariable">main</span> <span class="token operator">:</span> <span class="token constant">Html</span> <span class="token hvariable">message</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">Html.text</span> <span class="token operator"><|</span> <span class="token punctuation">(</span><span class="token hvariable">Tell.age</span> <span class="token number">1001</span><span class="token punctuation">)</span> |
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 đó.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">module</span> <span class="token constant">Tell</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token hvariable">boxVolume</span> <span class="token punctuation">,</span> <span class="token hvariable">age</span> <span class="token punctuation">,</span> <span class="token hvariable">position</span> <span class="token punctuation">,</span> <span class="token hvariable">list</span> <span class="token punctuation">,</span> <span class="token hvariable">any</span> <span class="token punctuation">,</span> <span class="token hvariable">day</span> <span class="token punctuation">)</span> <span class="token hvariable">boxVolume</span> <span class="token operator">:</span> <span class="token constant">Float</span> <span class="token operator">-></span> <span class="token constant">Float</span> <span class="token operator">-></span> <span class="token constant">Float</span> <span class="token operator">-></span> <span class="token constant">Float</span> <span class="token hvariable">boxVolume</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token hvariable">height</span> <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">area</span> <span class="token operator">=</span> <span class="token hvariable">a</span> <span class="token operator">*</span> <span class="token hvariable">b</span> <span class="token keyword">in</span> <span class="token hvariable">area</span> <span class="token operator">*</span> <span class="token hvariable">height</span> <span class="token comment">-- age : ...</span> |
1 2 3 | <span class="token comment">-- ...</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">Html.text</span> <span class="token operator"><|</span> <span class="token hvariable">String.fromFloat</span> <span class="token operator"><|</span> <span class="token punctuation">(</span><span class="token hvariable">Tell.boxVolume</span> <span class="token number">5.1</span> <span class="token number">6.9</span> <span class="token number">7.2</span><span class="token punctuation">)</span> |
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:
1 2 3 | <span class="token hvariable">boxVolume</span> <span class="token hvariable">a</span> <span class="token hvariable">b</span> <span class="token hvariable">c</span> <span class="token operator">=</span> <span class="token hvariable">area</span> <span class="token operator">*</span> <span class="token hvariable">c</span> <span class="token keyword">where</span> <span class="token hvariable">area</span> <span class="token operator">=</span> <span class="token hvariable">a</span> <span class="token operator">*</span> <span class="token hvariable">b</span> |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">module</span> <span class="token constant">Tell</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token hvariable">cylinderVolume</span> <span class="token punctuation">,</span> <span class="token hvariable">boxVolume</span> <span class="token punctuation">,</span> <span class="token hvariable">age</span> <span class="token punctuation">,</span> <span class="token hvariable">position</span> <span class="token punctuation">,</span> <span class="token hvariable">list</span> <span class="token punctuation">,</span> <span class="token hvariable">any</span> <span class="token punctuation">,</span> <span class="token hvariable">day</span> <span class="token punctuation">)</span> <span class="token hvariable">cylinderVolume</span> <span class="token operator">:</span> <span class="token constant">Float</span> <span class="token operator">-></span> <span class="token constant">Float</span> <span class="token operator">-></span> <span class="token constant">Float</span> <span class="token hvariable">cylinderVolume</span> <span class="token hvariable">radius</span> <span class="token hvariable">height</span> <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">sideArea</span> <span class="token operator">=</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token builtin">pi</span> <span class="token operator">*</span> <span class="token hvariable">radius</span> <span class="token operator">*</span> <span class="token hvariable">height</span> <span class="token hvariable">topArea</span> <span class="token operator">=</span> <span class="token builtin">pi</span> <span class="token operator">*</span> <span class="token hvariable">radius</span> <span class="token operator">^</span> <span class="token number">2</span> <span class="token keyword">in</span> <span class="token hvariable">sideArea</span> <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token hvariable">topArea</span> <span class="token comment">-- boxVolume : ...</span> |
1 2 3 | <span class="token comment">-- ...</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">Html.text</span> <span class="token operator"><|</span> <span class="token hvariable">String.fromFloat</span> <span class="token operator"><|</span> <span class="token punctuation">(</span><span class="token hvariable">Tell.cylinderVolume</span> <span class="token number">1.0</span> <span class="token number">9.0</span><span class="token punctuation">)</span> |
http://localhost:8000/src/Main.elm
Conditional Expression in JS
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment">// -- main : any -> null</span> <span class="token keyword">const</span> <span class="token function-variable function">main</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">_</span><span class="token punctuation">)</span> <span class="token operator">=></span> console<span class="token punctuation">.</span><span class="token function">log</span> <span class="token punctuation">(</span><span class="token function">tellAge</span> <span class="token punctuation">(</span><span class="token number">1001</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// -- tellAge : number -> string</span> <span class="token keyword">const</span> <span class="token function-variable function">tellAge</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">age</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span>age <span class="token operator"><=</span> <span class="token number">12</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Being built by Heaven"</span> <span class="token operator">:</span> <span class="token punctuation">(</span>age <span class="token operator"><=</span> <span class="token number">21</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Unpacking old Story"</span> <span class="token operator">:</span> <span class="token punctuation">(</span>age <span class="token operator"><</span> <span class="token number">101</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Learning new Lessons"</span> <span class="token operator">:</span> <span class="token string">"Finished Learning"</span> <span class="token comment">// -- start program</span> <span class="token function">main</span> <span class="token punctuation">(</span><span class="token number">Infinity</span><span class="token punctuation">)</span> |
(chưa đăng tải) [Declarative Programming + Elm] Bài 9 – …