haskell - mapM 如何与 Haskell 中的 const 函数一起工作?

标签 haskell constants combinations monads map-function

由于我一直在寻找优化我一直在制作的密码破解程序的方法,我遇到了一个列表中所有可能的字符组合的更短的实现,它使用了这个函数:

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/

相关文章:

haskell - 如何通过内存计算二项式系数?

java - 声明为内部类时 switch 语句中枚举值的行为

c++ - 为什么 "const int"到 "int"的转换有效,但 "const char[]"到 "char *"的转换无效

python - 计算包含给定单词一次的固定长度字符串的数量

c++ - 双自由或腐败(出): 0x0000000001a880a0 *** on combinatory algorithm using vectors

r - 如何将我现有的 R 代码从随机样本的输出更改为所有可能结果的列表?

c++ - 从 haskell 调用 C opencv 函数

haskell - LiquidHaskell : Trying to use assume keyword, 但数据类型不是数字

exception - Haskell (ghc) Control.Exception 中,try 和 catch 的区别

c++ - 编译器特定错误 : can't match function with const arguments