トップページ > プログラム > 2015年03月01日 > V/GWmw6D

書き込み順位&時間帯一覧

13 位/228 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000001001010000115



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
関数型プログラミング言語Haskell Part27_©2ch.net

書き込みレス一覧

関数型プログラミング言語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
こちらも、どのように使えば目的が達成できるか、分かりませんでした。


お二人とも、簡単な例を示していただけると助かります。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。