スポンサーサイト

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

F#入門基本編落穂拾い その1 (List.reduce)

F#入門編落穂拾い その1 (List.reduce)
 
「#入門編落穂拾い」では、入門的な内容だが、全体の流れから入門編では落ちてしまったものを、こまごまと脈絡なく思いつきで紹介していきたいと思います。
 
今回はList.reduceです。
 
例えばList.foldを用いて整数リストの和を求める場合を思い出してください。
 
List.fold (+) 0 [3;8;1]
 
のようにするのでした。
 
ここで、育てる種の初期値の0を与えずに和を求めるには、育てる種の初期値として、リストの最初の要素を採用し、それと次の項から演算を開始するという作業をすればよいことになります。
こういう作業用にList.foldが簡易化されたものがList.reduceです。
 
ということで上と同じことをList.reduceを使うと、次のようになります。
 
List.reduce (+) [3;8;1];;    
 
List.foldは種とリストの要素から、「引数2個の関数」を適用して次の種を育てて行くということで、関数の二つの引数はと特に同じ型である必要はなかったのですが、List.reduceは同じ型でなければなりません。
それぞれの型は次のようになります。
 
> List.fold;;
val it : (('a -> 'b -> 'a) -> 'a -> 'b list -> 'a) = <fun:clo@0>
 
> List.reduce;;
val it : (('a -> 'a -> 'a) -> 'a list -> 'a) = <fun:clo@0-1>
 
それとList.reduceの方は、空リストに使うと、エラーになりますので注意が必要です。
 
だだ単にList.reduceはList.fold f (List.head lst) (List.tail lst)と同じことです。 
(Visual Studio β2からはList.hdがList.head,List.tlがList.tlになったみたいです。
F#のversionにより、Listからみのメソッドはかなり変わりました。)
 
どんな時にList.reduceが便利かというと、例えばリストの最大値を求めるときです。
 
List.reduce (fun x y -> if x > y then x else y) [2;4;3;1]
 
で4が返ります。(List.maxという組み込み関数もすでにあるのですが)
種とリストの要素を比べて、種より要素の用が大きい場合は次の種としてその要素を使い、そうでなければ種はそのまま次の比較に移るという作業を繰り返すわけです。
 
これは
List.reduce (fun x y -> if (>) x  y then x else y) [2;4;3;1]
とも書けます。最小値を求めるなら関数(>)を(<)で置き換えればよいということになります。
 
 
それでは、自分で比較関数を与えて最大(最小)をリストから抜き出す関数をつくってみます。
 
let myContractSome comp lst =
    List.reduce (fun x y -> if comp x y = true then x else y) lst
 
使用例
 
> myContractSome (>) [2;4;6;8];;
val it : int = 8
 
> myContractSome (<) [2;4;6;8];;
val it : int = 2
 
//文字列のリストに対して一番長い文字列を返す。
> myContractSome (fun (x:string) y ->  x.Length > y.Length ) ["ab";"c";"def"];;
 
val it : string = "def"
 
ということで、関数を注入できる(関数を引数にできる)ということはとても便利です。
余談ですが、インターフェイスというのも、あとで関数を注入するためのスロットルだと、考えるとよいよ、とものの本に書いてありました。
スポンサーサイト

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

コメントの投稿

非公開コメント

No title

>if x.Length > y.Length then true else false
は、
x.Length > y.Length
でいいかと思います

No title

まったくその通りですよね訂正しました。(何をやってんだか)
        書きためた原稿が尽きかけている管理人でした。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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