After rewriting the sumNumberArray
program in JS
, I realized that the Pattern Matching
syntax is very neat but also has certain limitations. That is, this syntax cannot do quantitative testing of the data with the comparison statements <
, ==
, >
, etc. So we will need to note another syntax that can be used. The name is a Conditional Expression
.
1 2 3 | cd Documents && cd learn-elm elm reactor |
Conditional Expression
The name sounds familiar already. Definitely has something to do with if..else
. However, we should note that this is an expression
, not a structure
. The logic that works here is based on the condition of the data to choose the return value, not the statement to execute.
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
In addition, we have added a binding
syntax to be able to give a concise return expression with completely new identifier names relative to the parameters – then attach explanatory definitions to the names. that identifier.
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
In fact, this syntax looks pretty Imperative
, but is the only binding
option in Elm
. In another language called Haskell
, people often use a syntax that has the opposite interpretation like this:
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> |
Deductive writing with the resulting expression placed on the same line as the sub-program
definition expression on the left side will make it possible to extract the general definition information of the sub-program
very quickly in the first line. Then, if absolutely necessary, we can continue reading the binding
that explain the elements that appear in the original expression.
Well, in any environment where there is a tool, we will take advantage of that tool. Just use the let..in
syntax a lot and you will get used to it. Just read the expression in..
first. However, for that reason, we must be careful not to write multiple let..in
expressions in the same definition code. Because of this, it will be difficult to generalize information when reading. Ideally, we should have only one pair of let..in
and possibly multiple expressions of the same level after the let
to account for the essentials.
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> |
(unpublished) [Declarative Programming + Elm] Lesson 9 – …