【发布时间】:2021-07-14 19:35:07
【问题描述】:
nextState :: IO Int -> IO Int -- 0 1 0 2 0 1 0
nextState stateIO = do
value <- stateIO
putStrLn $ "Current state: " ++ show value
fmap (+1) stateIO
nextState' :: IO Int -> IO Int -- 0 1 2
nextState' stateIO = do
value <- stateIO
putStrLn $ "Current state: " ++ show value
return $ value + 1
main :: IO ()
main = do
let startStateIO = return 0 :: IO Int
let states = iterate nextState' startStateIO -- Use nextState or nextState'
stateInt <- states !! 3
print stateInt -- 3 in both cases
这个 Haskell 代码有 2 个函数,它们看起来都具有相同的行为。但是,打印调用显示nextState 被调用的次数比nextState' 多得多。
我有一个更大的项目,这是一个问题,我不知道如何转换该函数,以便它被调用的最少次数,所以我无法修复它。
为什么会发生这种情况,在一个不太简单的例子中如何防止它发生?
请注意,我的实际项目中的fmap (+1) 只是IO a -> IO a 的一个函数,而不是fmap (a -> a) - 整个事情都在IO 方面起作用,而不是使用(a->a) 修改里面的值
【问题讨论】:
标签: haskell recursion optimization