副鼻腔炎の症状は夕方から治まってきた。
加齢のせいか、回復が遅くなっている気がする。
F#
識別子パターンのマッチング
次の投稿*1で紹介されているコードのうち、単一の判別共用体を用いる識別子パターンのコードが分かりにくかった。実用的なコードの書き方が理解と学習の助けになるとは限らない。特に異なる要素への命名が重複することが、理解と学習の妨げになった。
件のコードは次のように記述されている。Money、Price、pの命名が重複しているため、どの命名がどの要素なのかを、コードだけ読んで直観的に理解するのが難しいのだ。
各要素に異なる命名を用いて、このコードは次の様に書き直せる。
次の記述は、コメント行の記述どちらも同じことをしている。何をしているかと言えば、
//let local_price = match param_price with CaseMoney local_p -> local_p let local_price = match param_price with CaseMoney (local_p) -> local_p
- 値local_priceは、match式の返り値を参照する。
- match式は、引数param_priceをパターンマッチで評価する。
- param_priceが判別共用体のケース"CaseMoney"の場合、local_pを返す。
- param_priceの値を取り出し、その値をlocal_pが参照する。
- CaseMoneyから取り出された値はdecimal型である。
- 従ってlocal_pもdecimal型となり、local_priceもdecimal型となる。
関数calcTaxはCaseMoneyを返すため、最後の計算でCaseMoneyへキャストしている。
このコードは、次の様に書き直すことができる。
このコードにて、各要素の命名を重複させると、件の記事で紹介されているコードになる。
ここまで記述して理解しないと、特に次の個所の違いに気付けない、理解できない人は多いのではないかと思う。
let calcTax (CaseMoney price) = CaseMoney (price * 0.1m) let p = CaseMoney 100m
let calcTax (Money price) = Money (price * 0.1m) let p = Money 100m