スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門第46回(列挙型)

今回のお題は「列挙型」です。
 
まずは宿題の解答から
(宿題)
string型(System.String)に、その文字の長さを表示するメソッドMyPrintLengthを追加してみてください。
たとえば "world".MyPrintLenght()で「文字数は5文字です」と表示するようにしてください。
 
(解答例)
 
type System.String with
    member this.MyPrintLength () =
        printfn "文字数は%d文字です" this.Length
 
(実行例)
 
> "world".MyPrintLength() ;;
文字数は5文字です
val it : unit = ()
 
列挙型(enumeration)は識別子のグループとprimitiveな整数型(sbyte byte int16 int32 uint64 uint16 uint32 uint64 char)(どれか一種類)を対応づけたものです。
これは、Discriminated Unionのように一つの型として利用できます。
例えば
 
type Rank =
    |A = 100
    |B = 70
    |C = 50
 
としておくと
 
> Rank.A = Rank.B;;
val it : bool = false
 
let judge x =
    if x > 1000.0 then Rank.A
    elif x > 100.0 then Rank.B
    else Rank.C
    
val judge : float -> Rank 
 
> judge 123.5;;
val it : Rank = B
 
列挙型はDiscriminated Unionより軽量です。一方列挙型は、それぞれ一種類のprimitiveな整数型しか、保持することができません。
実質的に列挙型は、整数型の見え方を変えたものですので、エラーが紛れ込む可能性も高くなります。例えば次のような意味のない演算も可能です。
> Rank.A + Rank.B;;
val it : Rank = 170
 
列挙型から整数型への変換は次のように行います。
> int Rank.C;;
val it : int = 50
 
整数型から列挙型への変換は次のように行います。
> enum<Rank> 50 ;;
val it : Rank = C
 
存在しない値でもエラーはでませんから、注意が必要です。
> enum<Rank> 20000 ;;
val it : Rank = 20000
 
ということで、ケースバイケースでDiscriminated Unionと使い分ける必要があるかと思います。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

列挙型の値

>それらの値はすべて異なったものである必要があります
別名を付けるという意味で、同じ値をつけてもOKだと思います。

No title

ありがとうございます。訂正しました。
プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。