モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

今日から始める F# “Day 4” キャスト、型拡張、そして SI 単位系

 どうもっす! 今日のネタはユニークな SI 単位系を取り上げようと思ったらそれに関して必要な前提知識、キャストと型拡張ができたのでいい感じになりそうっす!

概要

  1. キャスト
  2. 型拡張
  3. SI 単位系
  4. まとめ

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# の面白い一面が見えた気がします。

 以上!