为什么在列表清单中应用“序列”会导致计算其笛卡尔乘积? [英] Why does application of `sequence` on List of Lists lead to computation of its Cartesian Product?

查看:113
本文介绍了为什么在列表清单中应用“序列”会导致计算其笛卡尔乘积?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是关于 Prelude 中的序列函数,其签名如下所示:

  sequence:Monad m => [m a]  - > m [a] 

我明白这个函数对 List 可能 s。例如,在 [Just 3,Just 9] 上应用 sequence 给出 Just [3, 9]



我注意到在 List of <上应用 code> List s给出它的Cartesian Product。有人可以帮我理解这是怎么发生的?为什么会发生这种情况?

解决方案这是可行的,因为在Haskell中使用列表作为单子使他们成为模型的不确定性。考虑:

  sequence [[1,2],[3,4]] 



根据定义,这与以下内容相同:

  do x<  -  [1,2] 
y< - [3,4]
return [x,y]

只读它为首先选择1和2之间,然后选择3和4之间的选择。列表monad现在会累积所有可能的结果 - 因此,答案 [[1,3],[1,4],[2,3],[2,4] ]



(有关更加混淆的示例,请参阅


My question is about the sequence function in Prelude, the signature of which is as follows:

sequence :: Monad m => [m a] -> m [a]

I understand how this function works for List of Maybes. For example, applying sequence on [Just 3, Just 9] gives Just [3, 9].

I noticed that applying sequence on List of Lists gives its Cartesian Product. Can someone please help me understand how/why this happens?

解决方案

This works because using lists as monads in Haskell makes them model indeterminism. Consider:

sequence [[1,2],[3,4]]

By definition this is the same as:

do x <- [1,2]
   y <- [3,4]
   return [x,y]

Just read it as "First a choice between 1 and 2, then a choice between 3 and 4". The list monad will now accumulate all possible outcomes - hence the answer [[1,3],[1,4],[2,3],[2,4]].

(for an even more obfuscated example, see here)

这篇关于为什么在列表清单中应用“序列”会导致计算其笛卡尔乘积?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆