コピー 構文:type レコード型名=
{
定数名1:データ型
定数名2:データ型
...
}
member this.メソッド(<引数>)=
処理...
定義:
let 変数名:レコード型名={定数名1=<値>;定数名2=<値>;...}
メンバー呼び出し:
変数名.メソッド(<引数>)
コピー 構文:let 関数名(<引数>)=
処理...
{|要素名1=値1;要素名2=値2;...|}
コピー 構文:
{既存レコード with 定数名1=新値1;定数名2=新値2;...}
{|既存匿名レコード with 定数名1=新値1;定数名2=新値2;...|}
コピー //例:PGレコード"FSharp"を元に"QSharp"レコードを作成する
type PG=
{
language:string
typelang:string
developer:string
}
member this.outdetail()=printfn "lang=%s,type=%s,dev=%s" this.language this.typelang this.developer
//定義
let FSharp:PG={language="F#";typelang="Functional";developer="MicroSoft"}
let QSharp={FSharp with language="Q#";typelang="Quantum"}
//↑FSharpレコードを元に、languageとtypelangを変える
//確認
FSharp.outdetail()
QSharp.outdetail()
//出力
//lang=F#,type=Functional,dev=MicroSoft
//lang=Q#,type=Quantum,dev=MicroSoft
コピー 構文:type 共用体名=
|型名1 of データ名A1:データ型 * データ名B1:データ型 * ...
|型名2 of データ名A2:データ型 * データ名B2:データ型 * ...
...
コピー //Shapeの定義
type Shape =
| Rectangle of width : float * length : float
| Circle of radius : float
| Prism of width : float * float * height : float
//各型を宣言してみる
let rect = Rectangle(length = 1.3, width = 10.0)
let circ = Circle (1.0)
let prism = Prism(5., 2.0, height = 3.0)
1行目のrectはRectangle型,2行目のcircはCircle型,3行目のprismはPrism型を用いて値を割り当てていますが、ShapeのPrismの定義に注目すると"width:float*float*height:float"となっています
これはwidthとheightが名前付きフィールドであり、第2引数の「2.0」は匿名レコードとなっています
またmatch文を使って型の判断を行うことが出来ます
コピー //それぞれの型を判断し長さを返すgetShapeWidth関数
let getShapeWidth(shape)=
match shape with
| Rectangle(width = w) -> w
| Circle(radius = r) -> 2. * r
| Prism(width = w) -> w