我目前正在通过SICP http://mitpress.mit.edu/sicp/与哈斯克尔。练习 1.15 询问一个函数被调用了多少次。这个想法可能是您应该使用替换方法,但我想知道如何在代码中执行此操作。
在命令式语言中,我们可以保留一个全局变量,并在每次调用函数时递增它。但是你会如何用 Haskell(或纯函数方式)来实现它呢?
您可以使用Writer
monad 来完成此任务,前提是对相关函数的所有调用都可以组合到一个do
block:
import Control.Monad.Writer
myFunc :: Int -> Int -> Writer (Sum Int) Int
myFunc a b = tell (Sum 1) >> return (a + b)
callMyFunc :: ((Int, Int, Int), Sum Int)
callMyFunc = runWriter $ do a <- myFunc 2 3
b <- myFunc 8 7
c <- myFunc 3 5
return (a, b, c)
main = putStrLn $
"myFunc was called "
++ show (getSum $ snd callMyFunc)
++ " times and produced "
++ show (fst callMyFunc)
哪个输出:
myFunc was called 3 times and produced (5,15,8)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)