スポンサーサイト

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

F#入門基本編落穂拾い その20 (リスト構造(2))

それでは前回に定義したリスト構造の型に対して色々な関数を定義してみます。
まず、前回定義した型とその型を持つ値を再掲します。
 
> type myList =
    |Empty
    |Ele of int * myList  ;; 
 
> let t0 = Empty;; 
val t0 : myList = Empty
 
> let t1 =  Ele(1,t0);; 
val t1 : myList = Ele (1, Empty)
 
> let t2 =  Ele(2,t1);;
val t2 : myList = Ele (2, Ele (1, Empty))
 
> let t3 =  Ele(5,t2);;
val t3 : myList = Ele (5, Ele (2, Ele (1, Empty)))
 
> let t4 =  Ele(7,t3);;
val t4 : myList = Ele (7, Ele (5, Ele (2, Ele (1, Empty))))
 
まずはList.reverseに対応するものを定義してみます。
 
> let myReverse mlst =
    let rec sub rem res = //remはremain,resはresultの略
        match rem with
        |Empty
            -> res
        |Ele(v,rest)
            ->sub rest (Ele(v,res))
    sub mlst Empty;;
 
val myReverse : myList -> myList
 
(実行例)
> myReverse t4;;
val it : myList = Ele (1, Ele (2, Ele (5, Ele (7, Empty))))
 
次にList.mapに対応するものを定義してみます。(定義で、上のmyReverseを利用しています。)
 
> let myMap f mlst =
    let rec sub rem res =
       match rem with
       |Empty
            ->res
       |Ele(v,rest)
            ->sub rest (Ele((f v),res))
    myReverse (sub mlst Empty)  ;;
 
val myMap : (int -> int) -> myList -> myList
 
(実行例)
> myMap (fun i -> 2*i) t4;;
val it : myList = Ele (14, Ele (10, Ele (4, Ele (2, Empty))))
 
最後にList.foldに対応するものを定義してみます
 
> let myFold f acum mlst =
    let rec sub rem res =
        match rem with
        |Empty
            -> res
        |Ele (v,rest)
            ->sub rest (f res v)
    sub mlst acum;;
 
val myFold : ('a -> int -> 'a) -> 'a -> myList -> 'a
 
(実行例)
> myFold (fun s i -> s + i) 0 t4;;
val it : int = 15  // 7+5+2+1
 
(上は次と同じ意味
> myFold (+) 0 t4;;
val it : int = 15
 
ここまで簡略化の為、保持する値をint型に固定していましたが、通常はgenericを利用して一般の型で定義するのが定石です。
このリストの定義方法を一般の型で行うと次のようになります。
 
type myList<'a> =
    |Empty
    |Ele of ('a * myList<'a>) 
    
もしくは
 
type 'a myList =
    |Empty
    |Ele of ('a * 'a myList) 
    
 
使用例
 
> let t1 =  Ele(1.5,Empty);;
 
val t1 : float myList = Ele (1.5, Empty)
スポンサーサイト

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

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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