スポンサーサイト

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

F#入門第8回(関数に名前をつけよう)

今回のお題は「関数に名前をつけよう」です。

まずは前回の宿題の答えから
(1)与えられた数を2乗する関数を5に適用してください。
(答え)これは簡単で (fun x -> x * x) 5

(2)次はどのような関数を定義しているのでしょう。
fun x -> x > 1
(答え)仮引数がxで、これに対しx > 1 の値を返すので、引数が1より大きいときtrueを返し、1以下のときfalseを返す関数です。

(3)次はどうなるでしょう。
> (fun g -> g 1) (fun x -> x + 2);;
(hint)F#では関数も値で、引数にできます。
(答え)まず、左側の関数の定義部分ですが、仮変数gを受け取りg 1 すなわち、gを1に適用したものを返しています。よってgは、「int型から、何らかの型への関数」であるわけです。よって全体は「int型から、何らかの型への関数」を1に適用していることになります。
(ちょっとF#Interactiveで調べてみます。)

> fun g -> g 1;;
val it : (int -> 'a) -> 'a =

この場合(int -> 'a)が引数の型で、'aが返り値の型です。
型が決定できないときは、何かわからないけど「ある型」というのを'a,'b,'c....というように表します。

さて、問題では引数は(fun x -> x + 2)ですから、結果は(fun x -> x + 2)を1に適用したもので3が答えです。
(備考)この例の(fun g -> g 1)は関数を引数にとる関数でしたが、このように、関数を引数に取ったり、関数を結果として返す関数を高階関数(higher-order function)といいます。

前置きが長くなりましたが、それでは、今回のお題「関数に名前をつける」です。
前回までで、簡単な関数は定義できるようになったのですが、一度定義すると、それっきりで繰り返して使うことが、できません。そこで、名前をつけて繰り返し使えるようにしましょう。

F#では、関数も値ですから、let構文で、名前をつけることができます。

> let f = (fun x -> x + 1.0);;
val f : float -> float

このようにfという名前をつけると、fはfloat型からfloat型への関数だよ、とF# Interactiveは答えます。(返り値の計算の部分で、float型の1.0を足しているので,xはfloat型と推論され、返り値もfloat型と推論されるので、関数は(float -> float )型だと、型推論されているのです。)
なお let f = (fun x -> x + 1.0) はlet f = fun x -> x + 1.0 と括弧がなくてもかまいません。
さて、一度名前をつけると、簡単に色々な値に適用できます。
5.0に適用するなら、f 5.0 , (-3.0)に適用するなら f (-3.0) です。

> f 5.0 ;;
val it : int = 6.0

> f (-3.0);;
val it : int = -2.0

毎回、let ○ = (fun △ -> □ )と書くのも大変なので、これには略記法があります。
例えば
let f = (fun x -> x + 1) は
単に
let f x = x + 1
と書くことができます。(実はこちらの書き方の方が多用されます。)

上の例でもあったように、関数の型決定は、たいていの場合は、型推論にたよれば、よいのですが、たまに型注釈を付け加える必要が出てくることがありますので、関数の型注釈の方法を紹介しておきます。
上の方法でしたら、

引数だけに型注釈をつけると
let f = fun (x :int) -> x + 1

引数と返り値それぞれに型注釈をつけると
let f = (fun (x:int) -> ((x + 1):int))

関数全体に型注釈をつけると
let f :int -> int = fun x -> x + 1

または
let f = (fun x -> x + 1) : int -> int
となります。

下の方法でしたら
引数だけに型注釈をつけると
let f (x : int) = x + 1

引数と返り値それぞれに型注釈をつけると
let f (x : int) :int = x + 1

または
let f (x : int) = x + 1 : int
となります。

一番よくつかわれる形は下から二番目の
let f (x : int) :int = x + 1 の形かと思います。

それでは本日のまとめと宿題です。

まとめ

let 名前 = (fun x -> x + 1) は
単に
let 名前 x = x + 1 と書くことができる。
型注釈は色々書き方があるが、一番メジャーなのは例えば
let f (x : int) :int = x + 1 の形である。

宿題

(1)float型の引数を1個受け取って、その数を5倍した数を返す関数mul5を二通りの書き方で書いてください。

(2)int型の引数kを1個受け取って「引数よりkだけ大きい数を返す関数」を返す関数plusCを二通りの書き方で書いてください。またこの関数plusCの型を書いてください。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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