スポンサーサイト

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

F#入門15回(パターンマッチ(1))

今回のお題は「パターンマッチ(1)」です。
 
まずは宿題の答えから。
 
宿題 int型の引数nをとり、もしnが偶数だったら"Yes",奇数だったら"No"という文字列を返す関数isEvenを定義してください。(int型の数nを2で割った余りは中置演算子%を用いてn % 2 で求めることができます。)
答えは次の通りです。
 
let isEven n =
    if n % 2 = 0 then
        "Yes"
    else
        "No"    
 
以前二つのint型の数を引数にとって、それらの和と積をタプルにして返す関数がありました。ここに定義を書いてみます。
 
let test x y =
    (x + y ,x * y)
 
さて実際この関数を使うと、タプルが返ってきますが、和、積それぞれの値を取り出すにはどうすればよいのでしょうか。
答えはパターンマッチです。例えば次のようにします。
let (a,b) = (3,4)
このようにすると形的に対応する値がそれぞれ束縛されます。
(上の例では、aは3に束縛され、bは4に束縛されます。)
それでは、5と6をtestに渡して、返ってきた値について、sを和に,mを積に束縛してみます。
 
> let (s,m) = test 5 6;;
 
val s : int = 11
val m : int = 30
 
パターンマッチは様々なものを対象に使えるのですが、今回はとりあえずタプルに対するパターンマッチを紹介します。
 
それでは、次の関数をみてください。
 
let test2 (x,y) =
    (x + y , x * y)
 
さっきのtestとは型が異なることに注意してください。
testの型はint -> int ->(int*int)であるのに対して
test2の型は (int*int)->(int*int)です。
 
test2は次のように書いても同じです。
 
let test2 a =
    let (x,y) = a
    (x + y, x * y)
 
このように、かたまりのデータをバラバラにするとき、パターンマッチングは非常に有効な手段になります。
 
それでは、宿題です。
('c',7L,(8,"yes"),2)の型を答えてください。
また、それぞれxが束縛される値を答えてください。
 
(1)let (a,b,(x,c),d) = ('c',7L,(8,"yes"),2)
 
(2)let (a,b,x,d) = ('c',7L,(8,"yes"),2)
 
(3)let (a,x,b,d) = ('c',7L,(8,"yes"),2)
 
(4)let x = ('c',7L,(8,"yes"),2)
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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