どうもっす! 今日のネタはユニークな SI 単位系を取り上げようと思ったらそれに関して必要な前提知識、キャストと型拡張ができたのでいい感じになりそうっす!
概要
- キャスト
- 型拡張
- SI 単位系
- まとめ
1. キャスト
F# は基本 .NET と同じ型があると思ってもらえばいいかと。byte, sbyte, int16, uint16, int32 (int), uint32, int64, uint64, nativeint, unativeint, float (double), float32 (single), decimal, char, enum。
要注意なのは float。こいつ、single じゃなくて double です (ここが多言語と違う)。
キャストは簡単。普通に int x みたいにすればいいだけ。
2. 型拡張
例見てもらったほうがいいかと思います。
type Person(name) = member this.name = name type Person with member this.tostring() = this.name
簡単ですね。 type X with で始めればいいと。
3. SI 単位系
今回の目的、SI 単位系。FSharp.Core にありまして、UnitSymbols で定義されているもの (たとえば s)、UnitNames で定義されているもの (たとえば second) があります。
TimeSpan から int<second> および int<s> に変換する拡張メソッドを生やしましょう。
type System.TimeSpan with member this.toIntSecond() = (int this.TotalSeconds) * 1<Microsoft.FSharp.Data.UnitSystems.SI.UnitNames.second> member this.toInt_s() = (int this.TotalSeconds) * 1<Microsoft.FSharp.Data.UnitSystems.SI.UnitSymbols.s>
簡単ですね。実際に使ってみると
let timeSpan = new TimeSpan(2, 10, 40) let sec = timeSpan.toInt_s()
というような感じでしょうか。こんな感じで F# の利点を生かせるように変換をかけてごにょる、なんてこともできちゃいますー。
4. まとめ
SI 単位系なんて使えるのかーって思ってその好奇心でコード書いてたらこのエントリーが自然に仕上がった感じですね。しかし、なかなか面白いですね。言語で単位が扱えるなんて。また F# の面白い一面が見えた気がします。
以上!