top page > computer > haskell > web_lecture > for_programmer > on.html
更新日:
文責: 重城良国

2つの引数に同じ関数を適用

はじめに

関数を組み合わせるやりかたそのものを関数として定義できる。「2つの値に同じ関数を適用してから2引数関数に与える」という関数の組み合わせかたが関数onとして定義されている。

関数on

動作

2つの値に同じ関数を適用してから2引数関数に与える。「2つの数のそれぞれを3でわったあまりの比較」をする例だ。

on (==) (`mod` 3) 8 11

8を3でわったあまりと11を3でわったあまりとの比較だ。

Prelude> :m Data.Function
Prelude Data.Function> on (==) (`mod` 3) 8 11
True
Prelude Data.Function> ((==) `on` (`mod` 3)) 8 11
True

中置記法だと(`mod` 3)のうえで(==)を行うといった感じを強調できる。

定義

値x、yにそれぞれ関数fを適用したうえで関数opを適用する。

on op f x y = op (f x) (f y)

中置記法だと

(op `on` f) x y = f x `op` f y

となる。

a型の2つの値のそれぞれに適用する関数の型を(a -> b)とする。得られたb型の値2つを引数とする関数の型は(b -> b -> c)とできる。最終的な値の型はcである。

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c

使い道

関数onはソートでの大小比較のときの比較される2つの値の事前変換に使える。

課題

  1. 3引数関数の3つの引数すべてに同じ関数を適用する関数on3を定義せよ

「引数を入れ替える」へもどる 「まとめ: 関数」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics