2009-09-21 14 views
9

私はちょうどハスケルを学び、視線のアルゴリズムを実装するための最も慣用的な方法を見つけようとしています。状態モナドを使用するか、状態を再帰的に渡す方が良いですか?

私が見つけたデモコードは状態モナドを使用していますが、私は状態が再帰的に渡せるように(私はちょうど初心者です)簡単です。私はここで何が欠けていますか?パフォーマンス上の問題はありますか?

検索コードで:http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell

おかげで、

クリス。

+0

再帰が遅くなり、スタックが大きくなる可能性があります。 –

+7

@Tnay再帰は、より高速で一定のスタック領域で実行することもできます。 – Amok

+5

State MonadとST(あなたの記事で使われている "State Thread")のモナドは同じではないことを指摘しておきましょう。 – jrockway

答えて

11

すべての状態を渡すのが少し冗長になることがあります。また、状態モナドはほとんどのhaskellコーダーによってよく知られているので、あなたがしていることを知ることができます。モナドの外であなた自身の手を動かすと、あなたのコードが何をするのかを見分けるのが難しいかもしれません。

状態の変化をカプセル化するために状態モナドがきれいであることがわかりました。コードのどの部分がステートフルなのか(つまり、状態が変わるか状態に依存するか)はかなりわかります。純粋なものの残りの部分。

+1

モナドをうまく使う方法を学ぶことも重要です。そうでなければ同じことを達成する方法を知っている状況でそれらを使用すると、学ぶ良い方法になります。 – Amok

10

大きなプログラムの場合は、モナド内の配管を渡す状態を隠す方が良いです。エラーの危険性はそれほどありません。

3

明示的に状態を渡すのではなく、状態を渡すためにモナドを使用する利点は、使用できるモナドに多数の有用なコンバイナが定義されていることです。