多項式補間が少しあれば本当に簡単です!
最初に、短い月名のリストを見ました
["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]
文字のASCII値の合計を確認しました
[313,301,320,323,327,333,331,317,328,326,339,300]
次に、それらから300を差し引いて、ここで扱っていることを把握し、月の名前のすべての長いバージョンを含む配列を準備しました。
[13,1,20,23,27,33,31,17,28,26,39,0]
mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
私はあなたが今何が起こっているかを見ることができると思います-私が必要とするのは13に0、1に1、20に2などをマップする関数getIndexだけなので、私は簡単に行うことができます
getMonthName shortname = mons !! (getIndex shortname)
幸いなことに、Wolfram | Alpha はこれを私のためにできます!数字は少し大きくなりますが、Haskellはそれを優雅に処理できます。浮動小数点演算は少し不正確なので、結果を丸める必要があります!そこで、高速でエレガントで慣用的なHaskellを使用します。
import Data.Char
getIndex x = round $ 11 -
(220797068189915461*x)/11644212222720 +
(184127469431441671621*x^2)/6982771136140800 -
(8800438195450444577647153*x^3)/1013060436431307264000 +
(2826703553741192361967823*x^4)/2026120872862614528000 -
(269098602165195540339443*x^5)/2026120872862614528000 +
(13744405529566098359*x^6)/1692665725031424000 -
(13060656886070844161*x^7)/39727860252208128000 +
(5939638907108115199*x^8)/675373624287538176000 -
(303426664924585177*x^9)/2026120872862614528000 +
(2983240583426137*x^10)/2026120872862614528000 -
(12901227927103*x^11)/2026120872862614528000
mons = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
getMonthName = (mons!!).getIndex.subtract 300.fromIntegral.sum.fmap (ord.toLower)
次のように実行します。
λ> getMonthName "DeC"
"December"
λ> getMonthName "jan"
"January"