我最近正在阅读Michael Snoyman撰写的这篇博客文章.在那里建议的练习中,我试图自己定义$!运算符:
import Prelude hiding ( ($!) )
($!) :: (a -> b) -> a -> b
($!) f x = x `seq` f x
mysum :: [Int] -> Int
mysum list0 =
go list0 0
where
go [] total = total
go (x:xs) total = go xs $! total + x
main = print $ mysum [1..1000000]
Run Code Online (Sandbox Code Playgroud)
虽然记忆的使用很糟糕,但我认为这种方法效果很好.我的第一个问题是这个.为什么这不好用?
然后,我在Prelude中检查了它的定义.它写道:
($!) :: (a -> b) -> a -> b
f $! x = let !vx = …Run Code Online (Sandbox Code Playgroud)