スポンサーサイト

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

F#入門第11回(演算子と関数の関係)

今回のお題は「演算子と関数の関係」です。

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

> let powfs x y = System.Math.Pow (x,y);;
val powfs : float -> float -> float

> let powfs2 = powfs 2.0;;
val powfs2 : (float -> float)

> powfs2 3.0 ;;
val it : float = 8.0

それでは今日の内容です。次を見てください。

> 1 + 2;;
val it : int = 3

足し算というものは二つの数を受け取って、一つの値(和)を返すものとも考えることができます。これは、書き方が違うだけで、関数と考えることができます。
実際、F#では 1 + 2 を(+) 1 2 と書くことができます。
実験してみます。

> (+) 3.0 2.0;;
val it : float = 5.0

> (-) 7L 1L ;;
val it : int64 = 6L

> (*) 5 7;;
val it : int = 35

> (/) 3.0 2.0 ;;
val it : float = 1.5
また比較演算子(二つの数を比較してtrueまたはfalseを返すのでした。)でも同様です。

> (>) 2 1;;
val it : bool = true

ちなみに(+)をF#Interactiveで調べてみると

> (+);;
val it : (int -> int -> int) =

となり、ちゃんと関数として、認識してくれます。(型からもわかるように、部分適用もできます。)

このように二つの値の間において、作用する演算子を中置演算子といいますが、これは括弧をつけることによって、引数が二つの関数として扱うことができます。

また、値の前につける演算子not -などは、引数が一つの関数として扱うことができます。

> (not);;
val it : (bool -> bool) =

- , +などは、中間演算子との区別が必要なため ~ を前につけます。

> (~-);;
val it : (int -> int) =

> (~+);;
val it : (int -> int) =

また、逆に使える記号は限られますが(!$%&*+-./<=>?@^|~:で:だけは演算子名の先頭の文字としては使えない)、名前を()で囲み、引数が一個か2個の関数を定義すると、引数が一個のときは、前置演算子、2個のときは、中置演算子として使えます。
(私が実験してみた限りでは前置演算子の名前は~で始まる必要があるようでした。)

例1 引数1個で、前置演算子(後ろの数を2倍する)

> let (~$$) x = 2 * x;;
val ( ~$$ ) : int -> int

> ~$$ 3;;
val it : int = 6

例2 引数2個で中置演算子(2数の和と積の和を返す)

> let (+++) x y = x + y + x * y;;
val ( +++ ) : int -> int -> int

> 3 +++ 2 ;;
val it : int = 11

宿題
(1)一つの引数をとり、3加えた数を返す関数plus3を(+)と部分適用を利用して定義してください。

(2)一つの引数をとり、それが2より大きいときtrue、それ以外のときfalseを返す関数isMorethan2 を(<)か(>)と部分適用を利用して定義してください。。

(3)二つのfloat型の数に対し、これらの和の2乗を返す中置演算子 $++を定義してください。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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