如何解决需要基本的do块语法说明
在ghci中,我写道:
let x = do
i <- [1..5]
j <- [2..4]
return i
预期结果:
[1,2,3,4,5]
实际结果:
[1,1,5,5]
我不明白该输出背后的逻辑。我认为原因可能与monad有关,但是我对函数式编程非常陌生,希望有人能对此有所解释。
我还尝试了List理解中的等价形式,结果是相同的,这意味着我在这里误解了一些基本知识。
解决方法
这是因为do机制并不关心(幸运地)最里面的代码是否实际上引用了循环变量中的某些变量。
无论您使用最里面的代码,您总会得到3 * 5 = 15个值:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vi{1,2,3,4,5};
std::vector<int> vj{2,4};
for (int i: vi)
for (int j: vj)
std::cout << i << ",";
std::cout << std::endl;
return EXIT_SUCCESS;
}
据我所知,这是Haskell与C,C ++,Fortran,Python共享的完全标准的行为。
等效的C ++示例:
$ ./a.out
1,1,5,$
C ++输出:
$("#td-apt").on('click',function() {
getModalData();
$("#data-modal").modal('toggle');
});
function getModalData () {
$.ajax({
type: "POST",url: "/function/Data",headers: {
'X-CSRF-Token': $('input[name="_csrfToken"]').val()
},dataType: "json",success: function(data) {
console.log('success')
},error: function() {
alert('Error');
}
});
}
,
我还尝试了List-comprehension中的等价形式,结果是相同的
好主意。碰巧的是,对于列表,do
表示法与列表理解功能完全相同。 (实际上,a syntactic extension允许您对任何monad使用列表理解表示法,就像您可以对任何monad使用do
表示法一样。)
因此,您在问为什么[a | a<-[0,1],b<-[2,3]]
给出[0,1]
而不是[0,1]
。令人惊讶的方式是,如果您像数学中那样将列表理解视为 set comprehensions 。但是列表不是集合,尽管Haskellers确实经常使用列表作为集合的临时替代品。如果列表理解作为集合理解,那么
[x | x <- [0,0]]
还应仅产生[0,1]
作为其结果(或至少应产生与[x|x<-[0,1]]
相同的 结果)。
通常,这种除草重复项需要进行相等性检查,并且如果要使其高效,还可以使用排序或哈希方法。列表不做任何事情,因此,如果您想要类似集合的行为,则应使用集合实现数据结构。 Set
和HashSet
是最常见的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。