2010-12-14 14 views
6

我面臨以流程圖表示的實現算法(主要是業務邏輯樣式)的任務。我知道流程圖並不是最好的算法表示,因爲它的spaghetti-code屬性(這是CPS的用例嗎?),但我堅持用流程圖表示的規範。在Haskell中表示流程圖指定算法

雖然我可以在實施它們之前將流程圖轉換爲更合適的等效表示法,但這可能會使得難以「識別」最終實現中的原始流程圖,所以我希望有一些方法可以直接表示流程圖 - 算法在Haskell中作爲(也許是一元)EDSLs,因此與原始流程圖規範的相似性會更明顯。

回答

4

流程圖的一種可能表示方式是通過使用一組相互尾遞歸函數,將「轉到步驟X」轉換爲「使用狀態S評估函數X」。爲了提高可讀性,可以將動作(改變狀態的外部函數)和鏈接if/else或模式匹配組合成一個函數,以幫助確定下一步要採取的步驟。

這當然假設您的流程圖將被硬編碼(而不是從外部源運行時加載)。

+0

嗯,我沒有寫在原來的問題,但這就是我現在缺乏更好的想法(我可以做任何語言與尾遞歸支持),我希望那裏有更多Haskell-ish;是的,他們應該被硬編碼 – hvr 2010-12-14 11:45:28

+0

@hvr,我認爲這個想法很乾淨,而且是一個相當直接的編碼。你已經將自己定義爲一個Haskellish解決方案,因爲Haskellish程序不會考慮控制流。 – luqui 2010-12-14 22:49:44

1

聽起來像Arrows完全符合你所描述的內容。如果必須的話,做箭頭的可視化(應該很簡單),或者從流程圖生成/轉換箭頭代碼。

+1

我會對這裏的箭頭保持警惕 - 流程圖用於*控制流* - 箭頭捕獲*數據流*。 – sclv 2010-12-14 17:56:14

1

假設流程圖中存在「全局」狀態,那麼將其打包爲狀態monad是有意義的。至少在那時,不像你現在這樣做,每次調用都不需要任何參數,因此可以被讀爲a)修改狀態,b)在當前狀態條件下跳轉。