Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以实现Haskell'的js版本;它是以一种纯粹实用的方式解压的吗?_Javascript_Haskell_Functional Programming - Fatal编程技术网

Javascript 是否可以实现Haskell'的js版本;它是以一种纯粹实用的方式解压的吗?

Javascript 是否可以实现Haskell'的js版本;它是以一种纯粹实用的方式解压的吗?,javascript,haskell,functional-programming,Javascript,Haskell,Functional Programming,我正在以一种纯功能的方式实现javascript光线投射多边形点算法(背后没有特别的原因) 我陷入了困境,因为我需要从一个二维数组中获取两个数组(复制一个元组列表);类似于Haskell的unzip 有没有可能从像[[a,b],[c,d],[e,f]]这样的东西开始,在不使用过程式迭代器的情况下获得[[a,c,e],[b,d,f] (我知道这是一个微不足道的问题,我可以按程序实现该函数,然后忘记它,但我很想知道是否有解决方案) 编辑:为了澄清,我知道如何实现zip和unzip:我想知道是否可以

我正在以一种纯功能的方式实现javascript光线投射多边形点算法(背后没有特别的原因)

我陷入了困境,因为我需要从一个二维数组中获取两个数组(复制一个元组列表);类似于Haskell的
unzip

有没有可能从像
[[a,b],[c,d],[e,f]]
这样的东西开始,在不使用过程式迭代器的情况下获得
[[a,c,e],[b,d,f]

(我知道这是一个微不足道的问题,我可以按程序实现该函数,然后忘记它,但我很想知道是否有解决方案)



编辑:为了澄清,我知道如何实现
zip
unzip
:我想知道是否可以在没有
的情况下为
循环和变量重新分配实现它们。

您的解压只是一个zip,但有多个参数。大多数人不只是使用同一个函数的唯一原因是,
zip
在大多数情况下接收可变参数列表,而不是数组,因此需要使用解压函数中的
apply
解压

在我正在使用的Dojo库中,它们实现了zip和解压

解压:函数(/*Array*/a){
//摘要:类似于dojox.lang.functional.zip(),但需要
//作为输入的单个数组。
//描述:此函数类似于dojox.lang.functional.zip()
//并可用于解压打包的对象
//dojox.lang.functional.zip()
//不同方法签名的捷径。
返回df.zip.apply(null,a);
}
zip:function(){
//摘要:返回数组数组,其中第i个数组
//包含每个参数数组中的第i个元素。
//描述:这是久负盛名的拉链组合器(例如,
//有关一般详细信息,请参阅Python文档)
//数组被截断以匹配最短输入的长度
//数组。
var n=参数[0]。长度,
m=参数长度,
i=1,
t=新阵列(n),
J
P
对于(;i
请注意,zip接收多个参数,因此它更像Python zip,而不像Haskell zip



在没有变量赋值的情况下,将此代码转换为“纯函数”样式应该不难。您现有的代码应该已经在处理我发布的示例中的前两个FOR的工作(以最小长度截断zip并遍历其中一个列表的索引)。剩下的就是对第三个for做类似的事情——从列表中收集第i个值,而不是从两个列表中收集两个值

谢谢!不过,我一直在想,如果不使用过程迭代器(如
for
)是否可以实现这一点。在我发布的示例中,您的代码应该已经完成了前两个for的工作(以最小长度截断zip并迭代其中一个列表的索引)。您所需要做的就是第三个函数的工作——从一个列表中收集第i个值,而不是从两个列表中收集两个值。不过,我不推荐在这种性能敏感的库函数中编译高度递归的代码。但我想你不会真的介意这个案子的。嗯,你说得对!谢谢我真的认为这是不可能的,但现在它看起来很琐碎&我觉得很愚蠢:/-你能在回答中提到你的第一条评论的内容吗,这样我就可以接受了?考虑到JavaScript和Haskell对列表表示的不同,它们不能以相同的方式实现。Haskell将列表实现为单个链接的不可变结构。Java将列表实现为可变数组。对于前者,使用递归和模式匹配。对于后者,您使用For循环和索引。嗯,我知道Js没有列表。我指的是一个特定的函数,在一个受限的域中——我不需要它来处理“无限数组”(lulz)之类的东西。