一个例子:你想读入一堆数字,然后计算这些数字的不同幂和(平方和、立方和等)
第一步是“忽略 IO”——暂时忘记你将如何获得数字和功率参数——并专注于完成工作的函数——计算第 n 次的总和数字列表的幂。
powersum :: [Double] -> Int -> Double
powersum xs n = sum $ map (^n) xs
我们要计算各种指数的幂和。再说一次,我会忘记你以后要对它们做什么,无论是将它们打印出来、对它们进行排序等等,然后编写一个计算函数:
powersums :: [Double] -> [Int] -> [Double]
powersums xs ns = map (powersum xs) ns
现在让我们将它连接到现实世界。让我们首先考虑当我们预先知道指数但从标准输入中读取数字(都在一行上)的情况。
main = do line <- getLine -- IO
let nums = map read (words line) \
let exponents = [1..10] | - pure code
let sums = powersums nums exponents /
print sums -- IO
注意我们的 IO 是如何将我们的纯代码夹在中间的——这是非常典型的函数式程序。
现在假设您还想从标准输入读取指数,并打印出每个读取指数的幂和。你可以这样写一个命令式的程序:
main = do line <- getLine
let nums = map read (words line)
forever $ do exp <- read `fmap` getLine
putStrLn $ show $ powersum nums exp
这说明了如何存储数据(在本例中为nums)以供程序的其他部分使用。