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

2引数関数の引数と返り値に対する引数の追加と削除

(工事中 70%)

はじめに

1引数関数の引数と返り値に対する引数の追加と、結果としてできる関数からの引数と返り値のそれぞれからの引数の削除について見た。このような変換は2引数関数に対しても行うことができる。

関数myAdd

trans_2_args.hs

関数fと整数yをとり「整数xをとり整数f xとyを足し合わせる関数」を返す関数myAddを考える。

myAdd :: (a -> Int) -> Int -> (a -> Int)
myAdd f y x = f x + y

% ghci trans_2_args.hs
*Main> (myAdd (* 2) 3) 8
19

関数addと関数myAdd

関数addを以下のように定義しておく。

add :: Int -> Int -> Int
add = (+)

関数add(をInt型の値に対する)と関数myAddの型を比較する。

add :: Int -> Int -> Int
myAdd :: (a -> Int) -> Int -> (a -> Int)

関数addの第1引数と返り値に対して型aが引数として追加されている。

より一般的に

より一般的には以下のようになる。

fun :: X -> Y -> Z
fun' :: (a -> X) -> Y -> (a -> Z)

fun'は以下のように定義される。

fun' f y x = fun (f x) y

引数の追加

引数を追加する関数は以下のようになる。

addArg2 :: (b -> c -> d) -> ((a -> b) -> c -> (a -> d))
addArg2 fun f y x = fun (f x) y

*Main> :reload
*Main> let ma = addArg2 (+)
*Main> ma (* 2) 3 8
19

引数の削除

引数を削除する関数は以下のようになる。

rmArg2 :: ((a -> b) -> c -> (a -> d)) -> (b -> c -> d)
rmArg2 f x y = f (const x) y undefined

*Main> :reload
*Main> let ad = rmArg2 myAdd
*Main> ad 3 4
7

まとめ

以下の2つの関数はほぼ同じである。

以下の型を見たらより単純な形に変換できる。

「1引数関数の変換」へもどる 「失敗の可能性のある関数をつなぐ」へ

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