スポンサーサイト

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

F#入門第10回(タプルとカリー化)

まずは、宿題の解答からです。
宿題 int -> int -> int -> int ->int  型の関数を何個のint型の引数に適用すれば、int -> int 型の関数が返り値となるでしょうか。

5個int が並んでいるので、5-2 =3 で3個が答えです。

いままで、いくつか関数の例をあげましたが、すべて返り値は一つの値でした。
それでは、二つの数を引数にして、その二数の和、差を同時に返す関数は作れないものでしょうか。
返り値は一つしか持てないので、解決方法の一つとしては、「複数の値を組にしたものを、一つの値として返せばよい」というものです。
複数の値を組にするには括弧の中に値をカンマで区切って書きます。
F# Interactiveで実験してみます。

> (1,2.0);;
val it : int * float = (1, 2.0)

int型の数1とfloat型の数2.0を組にして、与えると int * float 型の一つの値として認識されたことが分かります。
それでは、「二つのfloat 型の数を引数にして、その二数の和、差を同時に返す関数test01」を作ってみます。

> let test01 (x :float) y = ( x + y ,x - y);;
val test01 : float -> float -> float * float
(型推論の力をあてにして、xにだけ型注釈をつけています。)
使用してみます。

> test01 2.0 5.0;;
val it : float * float = (7.0, -3.0)

注意するのは、二つの値が返ってきているわけではなく、二つの値を組にした一つの値が返ってきていることです。このように、二つ以上の値を組にしたものをタプルといいます。
型は各値の型を*でつないだものとして表されます。
たとえば、(1,'k',3.0)はint*char*float型です。

次の関数f1とf2の違いがわかりますでしょうか?

> let f1 x y = x + y;;

> let f2 (x,y) = x + y;;

これらは関数の型が違っていて、f1はint -> int -> int型で関数の部分適用ができる形であり、f2は (int*int) -> int 型で、引数一個の関数で、関数の部分適用ができない形になっています。
このように関数の部分適用ができる形の関数を「カリー化関数」といい、
引数がタプル1個の関数を「非カリー化関数」といいます。
基本的に.NETの関数は引数がタプル1個ですので「非カリー化関数」です。

それでは、次の非カリー化関数g1を見てください。

> let g1 (x,y,z) = x + 2*y + 3*z;;
val g1 : int * int * int -> int

これをカリー化関数として使えるようにするのは簡単で、例えば次のようにします。

> let g2 x y z = g1 (x,y,z);;
val g2 : int -> int -> int -> int

このように「非カリー化関数をカリー化関数に変換すること」をカリー化といいます。
.NETライブラリ関数を部分適用ができる関数として、扱うにはカリー化が必須となりますので、覚えておきましょう。(ただ.NETライブラリ関数はオーバーロードされているものが、多数ありますので、この場合は型注釈を利用して、きちんと対応をつけてください。)

まとめ
2個以上の値を括弧で括って、カンマで区切って組にしたものをタプルという。
タプルの型は其々の要素の型を*でつなげたものになる。
関数の部分適用ができる形の関数を「カリー化関数」といい、
引数がタプル1個の関数を「非カリー化関数」という。
「非カリー化関数をカリー化関数に変換すること」をカリー化という。

宿題
System.MathクラスのPowメソッドはSystem.Math.Pow(x:float,y:float) : float という形で、(二つのfloat型のタプルを引数にとり、xのy乗というfloat型の値を返す関数ですが、)これをpowfsという名前でカリー化してください。またxを2.0で固定して部分適用した関数をpowfs2という名前で定義し、さらにこれを3.0に適用してください。(すべてF# Interctiveで実行してみてください。)
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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