スポンサーサイト

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

F#入門基本編落穂拾い その39 制約(3)

まずは「value type constraint(値型制約)」と「refernce type constraint(参照型制約)」から、紹介します。
 
value type constraintは制約部分に : structとつけます。これは.NETのvalue type(スタック上に割り当てられる)でないといけないという制約です。
 
> let test x : 'a when 'a :struct =
        x ;;
 
val test : 'a -> 'a when 'a : struct
 
 
> test 3;;
val it : int = 3
> test "abc";;
 
  test "abc";;
  -----^^^^^
 
error FS0001: A generic construct requires that the type 'string' is a CLI or F# struct type
> test [1;2];;
 
  test [1;2];;
  -----^^^^^
stdin(46,6): error FS0001: A generic construct requires that the type ''a list' is a CLI or F# struct type
 
ということでstringもリストも参照型であることが分かります。(ただ前回やったように、これらは参照型ではありますが、F#でのequalityはstruct equalityとして定義されています。)
 
 
次にreference type constraintですが、これは制約時に :not structと付けます。これは.NETのreference type(スタック上にはポインターが置かれ、値自体はヒープ上に割り当てられる)に限るという制約です。
 

> let test2 x : 'a when 'a : not struct =
        x;;
 
val test2 : 'a -> 'a when 'a : not struct
 
> test2 [1;2];;
val it : int list = [1; 2]
 
> test2 "abc";;
val it : string = "abc"
 
> test2 (new MyClass(3));;
val it : MyClass = FSI_0023+MyClass {Val = 3;}
 
> test2 (fun( x :int)  -> x) ;;
val it : (int -> int) = <fun:it@5>
ということで関数もreference typeです
 
> test2 3;;
 
  test2 3;;
  ------^
 
error FS0001: A generic construct requires that the type 'int' have reference semantics, but it does not, i.e. it is a struct
 
> test2 (box(3));;
val it : obj = 3
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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