出一个趣味haskel题

编程
标签: #<Tag:0x00007f4c90137c28>
(假熊猫) #1

请问

mapM_ show "hello world"

的输出是什么?为什么呢?

(花花) #2

先说过程再说结果

mapM show "hello world"
等价于
sequence (map show "hello world")


map show "hello world"
的结果是
["'h'","'e'","'l'","'l'","'o'","' '","'w'","'o'","'r'","'l'","'d'"]

那么
sequence ["'h'","'e'","'l'","'l'","'o'","' '","'w'","'o'","'r'","'l'","'d'"]
的结果就等于列表里所有子表的笛卡尔积
(sequence的原理不多说,为什么是笛卡尔积,参见这个stackoverflow贴子

我们算一算,每个子表的成员有3个,那么笛卡尔积就会返回3^11个元素。

mapM_和mapM的区别在于不会收集每次sequence到的结果,它只返回一个(),所以我们就得到了一长串的
[(), (), (), ...
非要数的话,总共有3^11个空tuple。

1赞
(假熊猫) #3

咦花花,好久不见。

上次不小心写出这个东西来,搞了半天才发现show 一个Char有3的长度。

(没想到这破站还真有人回答

不过你这个角度比我高端多了,我当时按每个操作符硬推的(捂脸