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

型変換

はじめに

型変換を関数側でする例だ。「タプルを扱う関数」と「2引数関数」との相互変換について学ぶ前の準備だ。引数を変換するかわりに関数のほうを変換する考えかたを学ぶ。

値の変換

実数を半分にする関数を考える。

convert.hs

half :: Double -> Double
half = (/ 2)

整数値7で変数sevenを束縛する。

seven :: Integer
seven = 7

sevenにhalfを適用すると型エラーが生じる。

% ghci convert.hs
*Main> half seven

<interactive>:X:Y:
Couldn't match expected type `Double' with actual type `Integer'
In the first argument of `half', namely `seven'
In the expression: half seven
In an equation for `it' : it = half seven

「halfの第1引数のsevenに期待されるDoubleと実際のIntegerとのあいだで型の不一致が起きた」。関数fromIntegralで整数から実数に型変換する。

*Main> half $ fromIntegral seven
3.5

関数を変換する関数

関数のほうを変換することを考える。関数の型をDouble -> DoubleからInteger -> Doubleに変換する。

convert :: (Double -> Double) -> (Integer -> Double)

->は右結合なので右側の丸括弧は省略できる。

convert :: (Double -> Double) -> Integer -> Double

第2引数のIntegerをDoubleに変換して第1引数である関数に与えれば良い。

convert f n = f $ fromIntegral n

*Main> :reload
*Main> convert half seven
3.5

本質

f $ fromIntegral nはnにfromIntegralを適用した結果にfを適用する。fとfromIntegralの関数結合で表現できる。

convert f = f . fromIntegral

演算子の部分適用で仮引数fも消せる。

convert = (. fromIntegral)

convert halfはhalf . fromIntegralだ。引数のDoubleからIntegerへの変換は値のIntegerからDoubleへの変換である。

half :: Double -> Double
half . fromIntegral :: Integer -> Double

変換アダプタ

「値を変換するか関数を変換するか」は「変換アダプタをどちらにつけるか」だ。

[変換器の図1] [変換器の図2]

*Main> half (fromIntegral seven)
3.5
*Main> (half . fromIntegral) seven
3.5

まとめ

値を変換するかわりに関数を変換するという考えかたを学んだ。同じように関数curryや関数uncurryは「タプルにしたりばらばらにしたりする」変換を値ではなく関数に対して行う。

課題

  1. 対話環境で文字'c'を文字コードに変換したものが偶数かどうかをチェックせよ
  2. 文字コードへの変換を関数even側でするようにせよ

「タプル: 原点からの距離の例」へもどる 「カリー化」へ

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