我有t -> Maybe t
類型的各種「部分排列」功能,要麼通過返回Just
帶我到數據結構中的新位置,要麼返回Nothing
,如果他們還沒有到達那裏。Haskell中無限列表的編譯器優化?
我經常必須重複特定的模式將這些部分的排列,構建所有的中間值的列表,但截斷列表每當我回到起始位置或置換失敗。
scan_partial_perms :: Eq t => [t -> Maybe t] -> t -> [t]
scan_partial_perms ps v = map fromJust . takeWhile test $ scanl (>>=) (Just v) ps
where test (Just i) | i /= v = True
test _ = False
iterate_partial_perm = scan_partial_perm . iterate
cycle_partial_perms = scan_partial_perms perms . cycle
我相當有信心,有scanl
在這種情況下所期望的嚴謹和尾遞歸特性。任何其他優化此代碼的提示?特別是,我應該閱讀關於-O3 -fllvm
以外的哪些編譯器選項?
在最壞的情況,我可以像
perm l i = l !! i `rem` length l
定義的訪問函數替換scanl
和無限的名單我想像這不能改善然而正確的優化性能。
'-O3'意味着同樣的事情'-O2'。 – ehird
謝謝!另外,我是否應該將此代碼發佈到codereview.SE? –
我認爲這非常適合SO,因爲這個問題相當具體。 – Owen