最新

val it : α → α = fun

<<  2007/07  >>

2007/07/31 型の inconsistency の回避方法

Lingr では shiro さんに伝えたのだけど、あそこは流れてしまうので(アーカイヴァルだからぐぐれば出てくるけど)ここにも書いておく。あっ、ここも流れてしまうか。まあいいや。

えーと、たとえば次のようなコードがあって、

import Control.Arrow

x = map (+1)
y = filter (< 5)
z = sum

w = x >>> y >>> z

それで、「おっと x の定義を少し変えよう」というとき、

x = map (\(x,y) -> (x+1,y))

これはこれでいいんだけど w における型の不一致をどうするか、という問題。

もちろんこうしたら y も書き換えないといけなかったりするわけだし、全体から定義を変更する必要がある。でも x の書き換えが少し手間だと全部を書き換えるより前に対話環境で単体のテストしながら詰めたい。でも y や w の型検査がジャマになるというわけ。どうするか。

わたしは shiro さんが書いたように w をコメントアウトしちゃうことが多いんだけど、 where で x を局所定義することでも回避できる。

import Control.Arrow

x = map (\(x, y) -> (x+1,y))
y = filter (< 5)
z = sum

w = x >>> y >>> z
    where x = undefined

すると w から見える x は undefined (未定義値)となってグローバルな x を参照しない。だから型エラーにもならない。もちろん w を利用しようとするとエラーになるのだが、テスト中は型検査さえ騙せればそれでいいってわけ。で x を改変し終わったら次は y になって、ぜんぶ終わったら w で結合してみればいい。

というわけでした。

あ、ちなみに

x >>> y >>> z

は、

z . y . x

と同じです。 left to right もいいかなあと思ってちょっとそうしてみただけ。