Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Arrays Haskell数组的静态边界检查_Arrays_Haskell - Fatal编程技术网

Arrays Haskell数组的静态边界检查

Arrays Haskell数组的静态边界检查,arrays,haskell,Arrays,Haskell,有没有办法在Haskell数组上进行静态检查?让我们看看这个代码: import Data.Array let a = listArray (0, 10) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00] (0,10)实际上应该是(0,5),但编译器接受该代码。该

有没有办法在Haskell数组上进行静态检查?让我们看看这个代码:

import Data.Array
let a = listArray (0, 10) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00]

(0,10)
实际上应该是
(0,5)
,但编译器接受该代码。该错误仅在运行时检测到,尽管它可以在编译时检测到。

这在编译时无法检测到,因为列表的类型中没有保存其大小的内容,因此
listArray
函数不可能执行此类检查。此外,如果数据来自外部文件(例如),则很难进行静态大小检查


您需要一个依赖类型系统,如您在中找到的系统,这样才能实现类似的功能。

在这种情况下,如果编译器执行大量内联和常量折叠以实现无条件的
错误
(或其他)调用,则可能会检测到它。在大多数非平凡的程序中,它无法被检测到,至少不需要付出合理的努力。还有一个令人讨厌的停顿问题……使用(PDF)Ix类型获得边界的静态保证。如果你把这项工作交给Haskell,你会得到额外的积分。有一种方法,但太不方便了,不实用。有关这方面的更多信息,请尝试在web上搜索“类型级别的数字haskell”。对于装箱数组,编译器没有理由拒绝此代码。未定义的数组元素是完全合法的。它可能会发出警告(但可能有太少的病例可以通过合理的努力来发现)。@delnan为什么?检测这个问题(你声明一个10元素数组,但只提供6个元素的值)它和检测C++代码中的错误一样困难:<代码> Boo::数组= {0.1,0.2,0.3,0.4,0.5,0.6};<代码>,任何C++编译器都会做的。因此,没有根本的理由不能做到这一点。这里没有停止的问题——它都在同一行代码中。创建的不是列表,而是数组(Data.array)。是的,但是您使用列表创建数组。您可以使用
listary(start,end)someList
。但是在这段代码中,
someList
被显式地呈现给编译器,因此它可以轻松地进行检查。但是我想我现在明白了:Data.Array不是原生的Haskell类型。是的,检查是
length someList==end-start
(不是真的,但几乎是)。您可以在运行时执行此操作,因为此时可以计算列表的长度。如果你有
do{data好的,那么我想要的原则上是可以做到的,只是Haskell没有做到。