我听说在 Haskell 中,我们可以使用它MonadFix
来访问将来要评估的值。但我认为Monad
s 只是语法糖,所以应该有类似的东西可以在纯函数中实现。所以我尝试了以下方法:
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)]
我做错了什么吗?