2009-09-21 77 views
9

我剛剛學習Haskell,並試圖找出實現視線算法最常用的方法。使用狀態monad還是遞歸傳遞狀態會更好嗎?

我發現的演示代碼使用狀態monad,但對我來說(我只是一個初學者)遞歸地傳遞狀態似乎更簡單。我在這裏錯過了什麼?有沒有性能問題?

查找代碼爲:http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell

感謝,

克里斯。

+0

井遞歸可能會更慢,並導致您的堆棧增長 – 2009-09-21 19:54:19

+7

@Tnay遞歸也可以更快,並在恆定的堆棧空間中運行。 – Amok 2009-09-21 19:59:51

+5

值得指出的是,Monad和ST(您的文章使用的「State Thread」)monad並不相同。 – jrockway 2009-09-23 07:22:44

回答

11

它可能會變得有點冗長到處傳遞狀態。此外,狀態monad是大多數haskell編碼人員所熟知的,所以他們會知道你在做什麼。如果你手動推出自己的,在monad之外,識別你的代碼所做的事情會非常棘手。

我發現狀態monad整齊地封裝狀態變化,很明顯你的代碼的哪一部分是有狀態的(即改變或取決於狀態)w.r.t.其餘的純粹的東西。

+1

學習如何使用單聲道也很重要,所以在你知道如何完成相同的事情的情況下使用它們可能是學習的好方法。 – Amok 2009-09-21 20:13:28

10

對於較大的程序,最好隱藏在monad中傳遞管道的狀態。那麼錯誤的風險就會降低。

3

使用monad傳遞狀態而不是明確傳遞狀態的一個優點是,有許多有用的組合器可以用於monad,您可以使用它們。