アスキーコードから文字Xがアルファベットの24番目であることを割り出す。D]の長さが2であることを割り出す。16224を保存する。D]を文字Fと配列[D]に分解する。アスキーコードから文字Fがアルファベットの6番目をであること割り出す。配列[D]の長さが1であることを割り出す。(再帰3)次に配列[D]の処理に移る。配列[D]を文字Dと配列[]に分解する。アスキーコードから文字Dがアルファベットの4番目をであること割り出す。配列[]の長さが0であることを割り出す。(再帰4)次に配列[]の処理に移る。配列の長さが0なので、これまでに計算した値の合計を求める。1638416384をXFDの列番号として呼び出し元に返す。次に、アルファベットを数値に変換するロジックだけを抜粋し、細かいコメントを付けてみます。namespaceの宣言。F#はPythonのようにインデントがブロックになる。定数の定義(といってもF#は再代入できないから全部定数みたいなものだけど)。letは変数(常に定数?)や関数を定義するためのキーワード。アルファベットを数字に変換する関数の定義。型推論がうまくいかなかったので、明示的にstring型であることを指定している。ローカル変数ならぬ、ローカル関数の定義。cとtimesが引数。この関数では与えられた文字と数値(配列の長さ)から、その文字を数値に変換する。times)はpown関数の引数にAzLengthとtimesを与えている。cは文字列をアスキーコードに変換している。cがB(アスキーコードは66)、timesが2であれば。こちらもローカル関数。recは再帰呼び出しを可能にするためのキーワード。引数は数値であるretと文字の配列の2つ。利用されるので明示的には現れていない。渡された配列が空なら一つ目の引数である数値を返す(再帰処理の終わり)。配列が空でなければ、配列を文字(c)と残りの配列(chars)に分解する。chars.Length)上で定義したcalcDecimal関数に文字cと残りの配列の長さを渡す。cがB、charsの長さが2であれば1352が返る。retでここまでの数値の合計値が計算される。convertStr関数にこれまでの合計値と残りの配列を渡す。1つ前で作られたタプルを関数の引数として使うための演算子。convertStrは自分自身なので再帰処理となる。toColNumberを呼び出すとここから処理が実行される。1つ目は合計値の初期値である0。2つ目は文字列から変換された配列(厳密にいうとリスト)。先ほどと同様にロジックを文章で表現してみます。1354(AZB)の場合アルファベットは全部で26文字であることを定数で表現する。(再帰1)1354を26で割った商とあまりを求める。2アスキーコードからあまりの2をアルファベットのBに変換する。(再帰2)商の52を26で割った商とあまりを求める。0アスキーコードからあまり0をアルファベットに変換するとAより小さい@になってしまう。そこであまりが0になる場合だけ、商を一つ減らし、あまりを26と考える。26アスキーコードからあまりの26をアルファベットのZに変換する。(再帰3)商の1を26で割った商とあまりを求める。1アスキーコードからあまりの1をアルファベットのAに変換する。(再帰4)商が0になったので、これまでに割り出したアルファベットを連結する。AZBAZBを1354の列名として呼び出し元に返す。次に、数値をアルファベットに変換するロジックだけを抜粋し、細かいコメントを付けてみます。数字をアルファベットに変換する関数の定義。数値を文字(厳密にいうと長さ1の文字列)に変換するローカル関数。前の値を次の関数の引数にするパイプ演算子。Excel用に商とあまりを求めるローカル関数。nを26で割った商とあまりを求める。計算結果によって処理を分岐させる(パターンマッチ)。0であれば商を一つ減らし、26をあまりと見なす(そのまま戻り値になる)。それ以外の場合は商とあまりをそのまま戻り値と見なす。こちらもローカル関数。recは再帰呼び出しを可能にするためのキーワード。引数は文字列であるretと数値の2つ。利用されるので明示的には現れていない。2つ目の引数が0なら処理を終了し、1つ目の引数である文字列をそのまま返す(再帰処理の終わり)。それ以外であれば、まず商とあまりを求める。アドホックな関数を定義するためのキーワード。zを使った関数を定義できる。ここでは商とあまりを引数として受け取る関数を定義している。rem)であまりを文字に変換している。retで、その文字をこれまでに変換してきた文字列と連結している。quoはそのまま保持する。1つ前の行で作った文字列とあまりのタプルをconvertNum関数に渡す。convertNumは自分自身なので再帰処理となる。toColStringを呼び出すとここから処理が実行される。1つ目は文字列の初期値である空文字列。2つ目は最初に渡された数値。colNumおわりにえ〜っと・・・思ったほど分かりやすくならないですね。言い訳じゃないですけど、自分で書いてみるのが一番分かりやすいと思います。そのとき、できるだけで手続き型っぽくならないように関数型らしく書こうと努力すると、そのうちに関数型言語のパワフルさと面白さが見えてくるんじゃないかと思います。僕もネットや技術書を読むだけではF#や関数型言語の魅力がよく分かりませんでしたが、自分で手と頭を動かすと最近流行している理由が分かってきたような気がしました。F#や関数型言語に慣れていない人はきっと、このエントリを見ても魅力は伝わっていないと思うので、是非自分の手と頭を動かして関数型言語の魅力を味わってください!!・・・と少々強引な結論で、このエントリを終了します。(^o^;;あわせて読みたいF#の概要をつかむのであれば、bleisさんのこちらのエントリが分かりやすいと思います。~僕がF#を勉強したのはこちらの2冊です。はてなブログPro株式会社ソニックガーデンで働くRubyプログラマ。2017年11月に「プロを目指す人のためのRuby入門」を出版。blog)はてなブログをはじめよう!JunichiItoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。