由于我一直在寻找优化我一直在制作的密码破解程序的方法,我遇到了一个列表中所有可能的字符组合的更短的实现,它使用了这个函数:
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
有什么作用函数 do 输出给定字母的所有 4 个字母变体?
最佳答案
您可以了解mapM
使用这种直觉:
mapM f [x1, x2, ..., xN]
=
do y1 <- f x1
y2 <- f x2
...
yN <- f xN
return [y1, y2, ..., yN]
在你的情况下:mapM (const "abcd") [1 .. 4]
=
do y1 <- const "abcd" 1
y2 <- const "abcd" 2
y3 <- const "abcd" 3
y4 <- const "abcd" 4
return [y1, y2, y3, y4]
=
do y1 <- "abcd"
y2 <- "abcd"
y3 <- "abcd"
y4 <- "abcd"
return [y1, y2, y3, y4]
后者相当于一个列表推导式[ [y1, y2, y3, y4] | y1<-"abcd", y2<-"abcd", y3<-"abcd", y4<-"abcd"]
这将产生您的输出。
关于haskell - mapM 如何与 Haskell 中的 const 函数一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64540990/