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

単純な値の変換

(工事中 70%)

はじめに

単純な値を情報としての意味を変えずに関数にすることができる。

関数eight

eight.hs

「整数をとり何らかの値を返す関数」をとりその関数に引数として整数8を与えて何らかの値を返す関数を考える。

eight :: (Int -> a) -> a
eight f = f 8

この関数は以下のようにも書ける。

eight = ($ 8)

同じことだ。

関数eightは整数8とほとんど同じものだ。対話環境で見てみよう。

% ghci eight.hs
*Main> eight (+ 5)
13
*Main> eight even
True
*Main> eight id
8

単純な値から関数への変換

value_fun.hs

どのような値であれ関数eightのような関数に変換することができる。

x :: X
funX :: (X -> b) -> b
funX = ($ x)

この変換を行う関数を書いてみよう。

valToFun :: a -> ((a -> b) -> b)
valToFun x = ($ x)

試してみる

*Main> :load value_fun.hs
*Main> let three = valToFun 3
*Main> three (+ 7)
10
*Main> three even
False
*Main> :m + Data.Char
*Main Data.Char> let c = valToFun 'c'
*Main Data.Char> c isLower
True

関数から単純な値への変換

逆に単純な値と同じ意味を持つ関数を単純な値に変換する関数も書ける。

funToVal :: ((a -> a) -> a) -> a
funToVal = ($ id)

関数から単純な値への変換は引数に関数idを与えればいい。

*Main> :reload
*Main> let three = valToFun 3
*Main> funToVal three
3

同じ意味

追加の情報なしに「単純な値」と「関数」とが変換できた。よってこれらは情報としては等しいということがわかる。

まとめ

以下の2つの型の値は互いに変換可能であり情報としては同じものと考えることができる。

以下のような形の関数はより単純な形になおせることがわかる。

「ユニット型について」へもどる 「1引数関数の変換」へ

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