型の inconsistency の回避方法

This entry was posted by on Tuesday, 31 July, 2007

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 もいいかなあと思ってちょっとそうしてみただけ。

2 Responses to “型の inconsistency の回避方法”

  1. nobsun

    文脈によっては、x の型を文脈とともに明示的に与えないと、型検査が失敗することがあるとおもいます。

  2. 向井

    あーそれは確かにそうかも……