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

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

(工事中 70%)

はじめに

1引数関数の引数と返り値に対して引数を追加することができる。また、そのような形になっている関数からはそれらの引数を削除することができる。

関数myChr

trans_1_arg.hs

以下の関数を見てみよう。

import Data.Char (chr, ord)

myChr :: (a -> Int) -> (a -> Char)
myChr f = \x -> chr $ f x

関数fを引数にとり「引数にfを適用しchrを適用する関数」を返している。

% ghci trans_1_arg.hs
*Main> myChr (* 2) 55
'n'
*Main> ord 'n'
110
*Main> myChr ord 'j'
'j'

関数myChrと関数chrの型を比較してみよう。

chr :: Int -> Char
myChr :: (a -> Int) -> (a -> Char)

引数(Int)と返り値(Char)の両方に同じ型変数aが引数として追加されている。このような場合これらの関数は互いに変換可能だ。

引数を追加する変換

関数chrを関数myChrに変換する関数addArgを作る。型は以下のようになるだろう。

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

(->)は右結合なので括弧を省略できる。関数の定義は以下のようになるだろう。

addArg :: (b -> c) -> (a -> b) -> a -> c
addArg fun f x = fun (f x)

*Main> :reload
*Main> let mc = addArg chr
*Main> mc (* 2) 55
'n'

引数を削除する変換

関数myChrを関数chrに変換する関数rmArgを作る。型は以下のようになる。

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

括弧は省略できる。関数の定義は以下のようになる。

rmArg :: ((a -> b) -> a -> c)) -> b -> c
rmArg fun' x = fun' (const x) undefined

const xで値xを「引数を無視して値xを返す関数」に変換してfun'に与える。fun'はもうひとつ引数をとるがそこには何を入れても影響がないのでここではとりあえずundefined値を入れておく。

*Main> :reload
*Main> let ch = rmArg myChr
*Main> ch 110
'n'

まとめ

以下の2つの関数はほとんど同じものと考えられる。

以下のような型を持つ関数はより単純な関数に置きかえられる。

「単純な値の変換」へもどる 「2引数関数の変換」へ

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