【发布时间】:2020-10-26 16:17:32
【问题描述】:
当我一直在寻找优化我一直在制作的密码破解器的方法时,我遇到了一个列表中所有可能的字符组合的更短的实现,它使用了这个函数:
mapM (const xs) [1..n]
其中xs 可以是可用的字符,n 可以是所需单词的长度。
所以
mapM (const "abcd") [1..4]
会输出一个列表["aaaa","aaab","aaac","aaad","aaba","aabb"..] 等等。只有长度对右边的列表很重要,我可以写 ['f','h','s','e'] 或任何 4 元素列表。
我明白为什么列表无关紧要,它被传递给const 函数。我可以看到列表中的const 在技术上满足(a -> m a)。
但我的问题是:为什么输出不是简单的["abcd","abcd","abcd","abcd"],或者"abcdabcdabcdabcd"? const 函数如何输出给定字母的所有 4 个字母变体?
【问题讨论】:
-
等效方法:
replicateM 4 "abcd". -
列表是
Monad、mapM的一个实例。但是,您可以在此处使用replicateM:例如replicateM 4 ['a' .. 'z']。
标签: haskell constants combinations monads map-function