スポンサーサイト

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

F#入門基本編落穂拾い その29 モジュール、名前空間(1) 定義方法

モジュールというのは、値(関数含む)や型などをグルーピングする仕組みです。グルーピングすることによって、スコープを制御することができ、同名の識別子を持つものの混同を防ぎます。
 
大きく分けてモジュールにはトップレベルモジュール(一つのファイル全体で構成される)形のものと、トップレベルモジュール内に作る、ローカルモジュールというものがあります。
(トップレベルモジュール名を特に指定しない場合は、暗黙に、ファイル名の最初の一文字を大文字にしたトップレベルモジュール名がつけられます。ただ、複数のファイルから一つのdllファイルやEXEファイルを作成する場合はファイルのトップに明示的にモジュール名か名前空間名(後で取り上げます)を含める必要があります。両方含めるのもOKです。)
 
明示的にトップレベルモジュールに名前を付ける場合は、ファイルの最初にインシデントなしで
module トップレベルモジュール名
の形で、宣言します。
 
トップレベルモジュール内にさらにモジュールを作成することができます。
このモジュールをローカルモジュールといいます。
 
ローカルモジュールは
modue ローカルモジュール名 =
    内容
    内容
    
の形で定義します。モジュール名の後の=を忘れないようにしてください。
(ローカルモジュール名にはドットを含めることができません。)
 
 
ローカルモジュール内には、インシデントして、さらにローカルモジュールをネストすることができます。
 
それでは例を見てください。
 
module TopExpM
 
let n = 00
 
module LocExpM10 =
    let n = 10
 
module LocExpM20 =
    let n = 20
    
    module LocExpM201 = 
        let n = 201
 
モジュール内の値を参照するにはモジュール名の後にドットを付けます。
 
(練習)次のコードではどう表示されるでしょうか。
 
module TopExpM
 
let n = 0
 
module LocExpM10 =
    let n = 10
 
module LocExpM20 =
    let n = 20
    
    module LocExpM201 = 
        let n = 201
        printfn "%d" n
 
    printfn "%d" LocExpM201.n 
    printfn "%d" n
    printfn "%d" LocExpM10.n
 
printfn "%d" n
printfn "%d" LocExpM10.n
printfn "%d" LocExpM20.LocExpM201.n
 
(答え)
201
201
20
10
0
10
201
 
(注意)
F# Interactiveでは=なしのモジュール定義はできません。
 
トップレベルモジュールは一つのファイル内の値、型をグループ化するものでしたが、さらに高位のグループ化をするために名前空間が使用できます。
名前空間は複数のファイルに対して同一名で定義できます。(逆にいえば、一つの名前空間は、複数のソースコードに分割することができます。)
 
定義としては、ファイルの最初に(モジュールより前)に書きます。
namespace 名前空間名
 

namespace fc2BlogFsharpandenglishword
namespace jp.co.infoseek.hp.ajex 
 
なお名前空間は直接値や関数を含むことはできません。(モジュールで包んでおく必要があります。)
型定義は直接含むことができます。
 
例 //次はエラー
namespace MyNamespace
 
let funA () = printfn "hellow" //値は直接含むことができない
 
例 //次もエラー
 
namespace MyNamespace
 
do printfn "s"
 
例 //次は大丈夫
 
namespace MyNamespace
 
type Mytype =
     |Type1 of int
 
 
名前空間の下に一つのファイル内で複数のローカルモジュールを置く場合は例えば次のように書きます。
 
namespace 名前空間名
 
type 型名 =
    ............
 
module モジュール名1 =
    let ..........
 
 
module モジュール名2 =
    let ..........
 
名前空間の下に一つのファイル内でそのファイルの内容すべてが一つのモジュールに属する場合は次のように書きます
 
namespace 名前空間名
 
module モジュール名 =  // =が必要なことに留意!
 
    let .............等 //インシデントが必要
        
 
上はnamespaceキーワードを使わずに次のように書けます。
 
module 名前空間名.モジュール名 (この場合は=を付けない)
 
let  ............等   //左端から始まる
 
なおモジュールには次の形式でエイリアス(別名、あだ名)を付けることができます。
 
module 別名 = モジュール名
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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