Web Analytics

Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

20240630




副鼻腔炎の症状は夕方から治まってきた。
加齢のせいか、回復が遅くなっている気がする。


アクセス確認

impsbl.hatenablog.jp

F#

impsbl.hatenablog.jp

識別子パターンのマッチング

次の投稿*1で紹介されているコードのうち、単一の判別共用体を用いる識別子パターンのコードが分かりにくかった。実用的なコードの書き方が理解と学習の助けになるとは限らない。特に異なる要素への命名が重複することが、理解と学習の妨げになった。
件のコードは次のように記述されている。Money、Price、pの命名が重複しているため、どの命名がどの要素なのかを、コードだけ読んで直観的に理解するのが難しいのだ。

gist.github.com

各要素に異なる命名を用いて、このコードは次の様に書き直せる。

gist.github.com

次の記述は、コメント行の記述どちらも同じことをしている。何をしているかと言えば、

//let local_price = match param_price with CaseMoney local_p -> local_p
let local_price = match param_price with CaseMoney (local_p) -> local_p
  1. 値local_priceは、match式の返り値を参照する。
  2. match式は、引数param_priceをパターンマッチで評価する。
  3. param_priceが判別共用体のケース"CaseMoney"の場合、local_pを返す。
    • param_priceの値を取り出し、その値をlocal_pが参照する。
    • CaseMoneyから取り出された値はdecimal型である。
    • 従ってlocal_pもdecimal型となり、local_priceもdecimal型となる。

関数calcTaxはCaseMoneyを返すため、最後の計算でCaseMoneyへキャストしている。

このコードは、次の様に書き直すことができる。

gist.github.com

このコードにて、各要素の命名を重複させると、件の記事で紹介されているコードになる。

gist.github.com

ここまで記述して理解しないと、特に次の個所の違いに気付けない、理解できない人は多いのではないかと思う。

let calcTax (CaseMoney price) = CaseMoney (price * 0.1m)
let p = CaseMoney 100m
let calcTax (Money price) = Money (price * 0.1m)
let p = Money 100m

learn.microsoft.com