- 関数型プログラミング言語Haskell Part27_©2ch.net
732 :デフォルトの名無しさん[sage]:2015/03/01(日) 12:33:53.88 ID:V/GWmw6D - 例えばこのような型クラスとそのインスタンス型があるとします。
class ABC t where abc :: t -> IO Int data X = 何か instnce ABC X where abc x = 何か アプリケーションの本番環境ではこれでいいのですが、 この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。 abc関数をX型の値に適用したとき、戻り値を以前戻した値に基づいて計算したいとか、 適用する度に予め用意したリストから順に値を戻したいという場合があります。 例えば初めての適用なら5::IO Intを、2回目の適用なら13::IO Intを戻したいとか。 前回10::IO Intを戻したなら、今回はerror関数を使って例外を投げるとか。 状態を保存しないとできないことです。 このようなことが本番環境でも必要なら、ABC型クラスの定義を例えば下記のように変え、 class ABC t where abc :: t -> IO (Int, t) X型の値の中に状態を保存するようにします(要はMap型などと同じやり方です)。 しかし、今回はデバッグやテストのためだけです。 そのためだけに全体のアーキテクチャを変えてしまうのは如何なものかとも思うのですが、 デバッグやテスト優先で変えるべきでしょうか。 それとも、関数を使用する側は変えなくても良い、 あるいは変えるとしても些細な修正ですむ方法があるでしょうか。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
736 :デフォルトの名無しさん[sage]:2015/03/01(日) 15:10:50.59 ID:V/GWmw6D - >>734 >>735
デバッグやテストが目的なら躊躇せずSystem.IO.Unsfe系を使いましょうと言うことですか。 本番環境ではさすがに使いたくないですが、本番環境を汚さずにデバッグやテストするのが目的なら、 悩んで複雑な仕組みを構築するより、気をつけてUnsafe系を使う方法を考えた方が建設的てすね。 アドバイスありがとうございます。 >>733 どういうことでしょうか。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
739 :デフォルトの名無しさん[sage]:2015/03/01(日) 17:59:38.32 ID:V/GWmw6D - >>738
>>732でも言いましたが、本番環境でも状態を保存する必要があるのなら 私も迷わずその方法を採用したいと思います。 しかし、今回はデバッグやテストのためたけの仕組みです。 abc関数を使用する(呼ぶ)側にはあまり手を着けたくないというのが正直なところです。 多少修正する程度でしたらまだいいのですが、戻り値で状態を返し、 関数の呼び出し側でそれを保持するとなると、アプリケーションの作り方にまで影響が及びます。 できればそれはちょっと避けたいな、と。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
743 :デフォルトの名無しさん[sage]:2015/03/01(日) 22:48:32.59 ID:V/GWmw6D - >>741
後出しじゃんけんのようで本当にすいません。 結局やりたいのはこういうことです。 本番環境 ModuleA ABCクラスのインスタンス型の値を使う ModuleB ABCクラスの定義(abc :: t -> IO Int) ModuleC ABCクラスのインスタンス型Xの定義 ModuleD ABCクラスのインスタンス型Yの定義 テストやデバッグ用 ModuleX ModuleAの関数のテストやデバッグのために ABCクラスのインスタンス型Zの定義 要するにスタブとかダミーみたいなもの ただし、状態を保ちたい ABCクラスのインスタンス型の値の状態を保つことは、 本番環境では不要なことなんです。 状態を保たなくてもアプリケーションの処理は問題なく回ります。 本番環境に無くても良い余計な処理は入れたくないです。 ModuleAから呼ぶ関数はModuleBで定義したABCクラスのabc関数であって、 >>738のabct関数をModuleXで定義しても、ModuleAからは呼ばれません。 トンチンカンなことを言っていたらごめんなさい。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
744 :デフォルトの名無しさん[sage]:2015/03/01(日) 23:04:42.28 ID:V/GWmw6D - >>740
Writer Int型を使うということでしょうか。 今回の目的を達成するためにはどのように使えばよいか考えてみましたが、 すいません、よく分かりませんでした。 どのように使えばよいのでしょうか。 >>742 こちらも、どのように使えば目的が達成できるか、分かりませんでした。 お二人とも、簡単な例を示していただけると助かります。
|