5

Haskellはラムダ計算のために多くの言語よりも数学的ですが、ドメインの数は不完全だと思います。たとえば、とはIntegerありますが、または、またはドメインとしてはありません。これにより、コンパイラが型エラーをキャッチできたとしても、関数が安全でなくなることがあります。例:modは実行時にのみ 出力します。しかし、私たちは次のようなものを持つことができます; ガード、インターバル、または別のデータ型のようなもの...ゲームでは、キャラクターの寿命が正の数になるようにします。または、0から100まで、下ではなく、上ではありません。彼が殴られたとき、私は醜いものを呼ぶ必要があります。Cでさえ持っています。FloatPositiveNegative[1..5]50*** Exception: divide by zeromod :: Integral a => a -> a -> amod :: Integral a, a != 0 => a -> a -> apositive x = if x > 0 then x else 0signedunsigned

それは弱点ですか、それとも「間隔」ドメインがない理由ですか?これを修正するパッケージはありますか?

4

2 に答える 2

6

Agda、Idris、Coq などの依存型言語を探しているようです。

おっしゃる通り、数値型を制限するのは良いことですが、それらの型をどのように使用するかについても考える必要があります。mod値を除外するタイプがあるとしましょう0。次に、プログラムでそれを呼び出す必要があります。数値がリテラルの場合、おそらくコンパイラーがそうでないと判断して0関数を呼び出すのは「簡単」ですが、実行時にユーザー入力または複雑な手順から数値が提供された場合はどうなりますか? 0に渡すときに数値がそうではないことを知っていることをコンパイラーに説明する何らかの方法が必要ですmod。Haskell には、簡単な方法でそれを行う機能が実際にはありません (すべての値を型システムに反映するような厄介な方法があります)。

于 2012-07-15T22:12:36.280 に答える
6

そのようなクラスは自由に作成できますが、おそらく Haskell に含まれていない理由は、それらを頻繁に使用できるようにする方法を人々が見つけられなかったからでしょう。

クラスで減算が必要なのは明らかですが、それを閉じたい場合もあります。

もしかしてこういうこと?

NonNegative x - NonNegative y = NonNegative (max (x - y) 0)

しかし、アイデンティティx - y + y == xは保持されません。

'Numeric Prelude'など、Haskell の代わりの数値階層が作成されました。Haskell は非常にカスタマイズしやすく、Prelude を独自の定義に置き換えることもできますが、それらが有用であり、解決する以上の問題を引き起こさないかどうかは別の問題です。

于 2012-07-16T02:51:18.920 に答える