我面臨以流程圖表示的實現算法(主要是業務邏輯樣式)的任務。我知道流程圖並不是最好的算法表示,因爲它的spaghetti-code屬性(這是CPS的用例嗎?),但我堅持用流程圖表示的規範。在Haskell中表示流程圖指定算法
雖然我可以在實施它們之前將流程圖轉換爲更合適的等效表示法,但這可能會使得難以「識別」最終實現中的原始流程圖,所以我希望有一些方法可以直接表示流程圖 - 算法在Haskell中作爲(也許是一元)EDSLs,因此與原始流程圖規範的相似性會更明顯。
我面臨以流程圖表示的實現算法(主要是業務邏輯樣式)的任務。我知道流程圖並不是最好的算法表示,因爲它的spaghetti-code屬性(這是CPS的用例嗎?),但我堅持用流程圖表示的規範。在Haskell中表示流程圖指定算法
雖然我可以在實施它們之前將流程圖轉換爲更合適的等效表示法,但這可能會使得難以「識別」最終實現中的原始流程圖,所以我希望有一些方法可以直接表示流程圖 - 算法在Haskell中作爲(也許是一元)EDSLs,因此與原始流程圖規範的相似性會更明顯。
流程圖的一種可能表示方式是通過使用一組相互尾遞歸函數,將「轉到步驟X」轉換爲「使用狀態S評估函數X」。爲了提高可讀性,可以將動作(改變狀態的外部函數)和鏈接if/else
或模式匹配組合成一個函數,以幫助確定下一步要採取的步驟。
這當然假設您的流程圖將被硬編碼(而不是從外部源運行時加載)。
假設流程圖中存在「全局」狀態,那麼將其打包爲狀態monad是有意義的。至少在那時,不像你現在這樣做,每次調用都不需要任何參數,因此可以被讀爲a)修改狀態,b)在當前狀態條件下跳轉。
嗯,我沒有寫在原來的問題,但這就是我現在缺乏更好的想法(我可以做任何語言與尾遞歸支持),我希望那裏有更多Haskell-ish;是的,他們應該被硬編碼 – hvr 2010-12-14 11:45:28
@hvr,我認爲這個想法很乾淨,而且是一個相當直接的編碼。你已經將自己定義爲一個Haskellish解決方案,因爲Haskellish程序不會考慮控制流。 – luqui 2010-12-14 22:49:44