2012-03-17 13 views
5

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)する必要がありますが、コンパイラは、コードを受け付けます。このエラーは、コンパイル時に検出される可能性があるにもかかわらず、実行時にのみ検出されます。

+2

おそらく、コンパイラが無条件の 'error'(または何でも)呼び出しに達するために多くのインライン化と定数フォールディングを行う場合、* ** **このケースでは*検出される可能性があります。ほとんどの重要なプログラムでは、少なくとも合理的な努力では検出できません。そして、この厄介な停止問題があります... – delnan

+0

[習慣](http://hasp.cs.pdx.edu/habit-report-Nov2010.pdf)を使用してください(PDF)Ix型は、境界の静的な保証を取得します。あなたがこの作品をHaskellに移植すると、ボーナスポイントが得られます。 –

+0

方法がありますが、実用的にはあまりにも不便です。これについてもっと詳しく知りたい場合は、Webで「タイプレベル番号haskell」を検索してみてください。 –

答えて

7

リストの型にサイズを保存するものがないため、listArray関数はこのようなチェックを実行できないため、コンパイル時には検出できません。また、データが外部ファイル(たとえば)から来た場合は、静的なサイズチェックが機能するようにするのは非常に難しいでしょう。

にあるような従属型システムが必要です。

+0

作成されるのはリストではなく配列(Data.Array)です。 –

+0

はい、ただし、リストを使用して配列を作成しています。 'listArray(start、end)someList'を実行します。 – dflemstr

+0

しかし、このコードでは 'someList'が明示的にコンパイラに与えられているので、簡単にチェックできます。しかし、私は今それを理解していると思います。Data.ArrayはHaskellのネイティブタイプではありません。 –