スポンサーサイト

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

F#入門第22回(match式(2))

今回のお題は「match式(2)」です。
 
まずは宿題の答えです。
(宿題)
リストと数 kを引数にして、リスト内でkより大きい最初の要素eを探して、見つかれば”見つかりました。kより大きい最初の要素はeです”と表示し、見つからなければ”kより大きい要素は見つかりませんでした”と表示する関数dispFirstMoreThanを定義してください。(List.tryFindとmatch式を使用してください。)
 
(宿題の答え)
 
let dispFirstMoreThan k lst =
    let fe = List.tryFind (fun x -> x > k) lst
    match fe with
    | Some(e) -> printfn "見つかりました。%Aより大きい最初の要素は%Aです" k e
    | None    -> printfn "%Aより大きい要素は見つかりませんでした" k
 
実行例
 
> dispFirstMoreThan 1.5 [1.0;0.1;2.8;6.0];;
見つかりました。1.5より大きい最初の要素は2.8です
val it : unit = ()
 
> dispFirstMoreThan 9.0 [1.0;0.1;2.8;6.0];;
9.0より大きい要素は見つかりませんでした
val it : unit = ()
 
さて、まずはタプル対象のmatch式です。
次の例を見てください。
 

 
let isSecond2 tup =
    match tup with
    |( _,2) -> true
    | _ -> false 
 
val isSecond2 : 'a * int -> bool
 
('a *int)型のタプルを引数にとり、2番目の成分が2ならtrueそれ以外のときはfalseを返します。
 
when guardを使った次の場合と同じです。
 
let isSecond2 tup =
    match tup with
    |( _,a) when a = 2 -> true
    | _                -> false 
 
次のように書いても同じです。
 
let isSecond2 (a,b) =
    match b with
    | 2   -> true
    | _   -> false 
    
 
またパターンを組み合わすこともできます。
or に対応するのが|で、and に対応するのが &です。
 
例(int * int )型のタプルを引数にして、最初の二つのどちらかが1の時か "最低どちらかが1",両方とも2のときは "ともに2”,それ以外のときは”それ以外”と表示します。
 
let judge12 x =
    match x with
    | (1,_) | (_,1) -> printfn "最低どちらかが1"
    | (2,_) & (_,2) -> printfn "ともに2"
    | _             -> printfn "それ以外"
    
|の方はよく改行したりします。
 
上を改行した例
 
let judge12 x =
    match x with
    | (1,_) 
    | (_,1) 
            -> printfn "最低どちらかが1"
    | (2,_) & (_,2) 
            -> printfn "ともに2"
    | _             
            -> printfn "それ以外"
(注)ふつう「ともに2」は(2,2)とマッチさせます。
 
次にリストとのマッチです。
リストで、パターンマッチに使われるのは、すべての要素を列挙した形と
::を使用した形です。
まずは、すべての要素を列挙した形です。
ほぼ、タプルと同じなのですが、リストは要素数が色々ありうることと、空リストを考えに入れるのを忘れないようにしましょう。
次は要素数が0か1か2なら表示する関数です。
 
let ele012Disp x =
    match x with
    |[]     -> printfn "0"
    |[_]    -> printfn "1"
    |[_;_]  -> printfn "2"
    | _     -> printfn "more than 2"       
 
val ele012Disp : 'a list -> unit
 
実行例
 
> ele012Disp [];;
0
 
> ele012Disp [8;3];;
2
 
次は::を使用した例です。少し復習をしておきます。
 
> 3::[];;
val it : int list = [3]
 
> 1::[2;3];;
val it : int list = [1; 2; 3]
 
::は要素とリストにはたらき、要素をリストの先頭に挿入するのでした。
リストの先頭の要素をヘッダ、リストから先頭の要素を取り除いたものをテールというのでした。
パターンマッチを使うと、リストをヘッダとテールに分解できます。
ただ、空リストのときは、分解できないことに注意してください。
 

 
let toHdTl lst =
    match lst with
    |[]       -> printfn "empty"
    |hd :: tl -> printfn "hd = %A  tail = %A" hd tl
 
val toHdTl : 'a list -> unit
 
実行例
 
> toHdTl [1;2;3;4];;
hd = 1  tail = [2; 3; 4]
val it : unit = ()
 
> toHdTl [1];;
hd = 1  tail = []
val it : unit = ()
 
> toHdTl [];;
empty
val it : unit = ()
 
上の形にくらべると大きく使用頻度は低くなりますが、a::b::リスト の形でもパターンマッチは使えます。
 

 
let first2ele lst =
    match lst with
    |[]
    |[_]        ->printfn "要素が2個ありません"
    |a::b::rem  ->printfn " %A %A " a b
 
実行例
 
> first2ele [6.0;1.1;4.3;4.3];;
 6.0 1.1 
val it : unit = ()
 
> first2ele [6.0];;
要素が2個ありません
val it : unit = ()
 
それでは宿題です。
リストと数 kを引数にして、リスト内でkより大きい最初の要素eを探して、見つかれば”見つかりました。kより大きい最初の要素はeです”と表示し、見つからなければ”kより大きい要素は見つかりませんでした”と表示する関数dispFirstMoreThanを定義してください。(List.filterとmatch式を使用してください。)
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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