Haskell中<$>和<*>如何发音?二者功能及在幂集求和代码中的作用?
符号发音
两个符号的常用发音非常好记:
<$>:正式场合直接读fmap即可,日常交流也可以叫「map操作符」<*>:正式场合直接读apply即可,日常交流也可以叫「应用操作符」
作用解释(外行也能懂的版本)
你可以先把代码里的所有列表,都理解成「一堆可选的结果」,你写的幂集和计算本质就是:给你一堆数字,每个数字可以选加或者不加,最后把所有选择对应的总和全部列出来。
这两个操作符的作用刚好对应处理「可选结果」的两个常见需求:
<$>:你手里有一个固定的操作,想把这个操作挨个用到另一堆可选结果的每一个上面,得到新的一堆可选结果<*>:你手里的操作本身也有好几种可选,想把每一种操作挨个用到另一堆可选结果的每一个上面,得到所有组合的可选结果
拿你写的核心代码(+) <$> [x, 0] <*> allSums xs来举例就非常好理解:
- 这里
[x, 0]的含义就是处理当前数字x的两个选择:加x,或者加0(也就是不加x) (+) <$> [x, 0]就是把加法分别用到x和0上,得到两个半完成的操作:「给某个数加x」、「给某个数加0」- 后面的
<*> allSums xs就是把这两个半完成的操作,挨个应用到之前已经算好的、剩下的数字所有可能的总和结果上,刚好就覆盖了当前数字选加或者不加的所有情况,自然就能算出所有幂集的元素和。
你额外加的x为0时跳过的判断也很巧妙:因为加0和不加0的结果完全一致,跳过可以避免产生重复的计算过程。
内容的提问来源于stack exchange,提问作者daikonradish
相关产品推荐
相关产品推荐

