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

追加: ($)の連続を(.)に置き換える

はじめに

Haskellでは連続した($)の最後以外を(.)に置き換えられる。

小文字化し文字コードを求め7で割った余りが偶数であることを確認する関数を考える。

import Data.Char

fun c = even $ (`mod` 7) $ ord $ toLower c

($)を(.)に置き換える。

fun c = even . (`mod` 7) . ord $ toLower c

一般的に

以下の2つは同じだ。

f $ g $ h $ x

f . g . h $ x

値xに関数hを適用しそれにgを適用しfを適用するのと3つの関数f, g, hを関数合成しそれを値xに適用するのとは同じだ。

演算子の優先順位

(.)の演算子の結合力が($)よりも強いために置き換えが可能となる。明示的に丸括弧をつけると以下のようになる。

f $ (g $ (h $ x))

(f . (g . h)) $ x

どちらが良いか

fun c = even . (`mod` 7) . ord $ toLower c

これをさらに以下のように変換できる。

fun c = even . (`mod` 7) . ord . toLower $ c

「関数funを値cに適用したもの」と「関数even . (`mod` 7) . ord . toLowerを値cに適用したもの」とが等しい。

fun = even . (`mod` 7) . ord . toLower

($)を(.)に変換することで仮引数を消せることに気づいた。見た目の美しさもあり(.)に置き換えた形のほうが良いのではないかと思われる。

まとめ

僕なりのコーディング規約のようなものだ。($)が連続する場合には最後の($)以外を(.)に置き換えている。

「多相関数」にもどる 「1から学ぶHaskell」トップへ

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