我聽說在Haskell中,我們可以使用MonadFix
來訪問將在未來評估的值。但我認爲Monad
只是語法糖,所以應該有類似的東西,可以在純函數中實現。所以,我試過如下:如何使「時間機器」在Haskell中工作?
timemachine :: [a] -> (a -> Int -> b -> b) -> b -> b
timemachine al f b = result where
~(total, result) = foldr app (0,b) al
app a (i,b1) = (i+1, f a (total - i) b1)
main :: IO()
main = print $ timemachine "ddfdfeef" (\x i y -> (x,i):y) []
但預計不會輸出:
[('d',1),('d',2),('f',3),('d',4),('f',5),('e',6),('e',7),('f',8)]
理想的結果應該是
[('d',8),('d',7),('f',6),('d',5),('f',4),('e',3),('e',2),('f',1)]
難道我做錯了什麼?
你爲什麼期待這樣的結果?懶惰(?)來自你的代碼? –
那麼我的實現可能完全錯誤,但有沒有什麼正確的方法來獲得預期的結果?關鍵是我需要訪問未來的價值 - 在上面的例子中,列表的長度。 –
如果我正確理解你,你需要使用'MonadFix'來請求一些代碼的解除版本。你給了我們最初的東西似乎是公平的。 :-) –