2016-11-11 5 views
0

私は、次のコードを持っている:より効率的な整数データ型の処理方法はありますか?

datatype eInt = infinity of int | 0 | Int of int; 

exception undefined; 
fun eAdd(e1:eInt, 0:eInt) = e1 
    | eAdd(0, e2) = e2 
    | eAdd(e1, infinity) = infinity 
    | eAdd(infinity, e1) = infinity 
    | eAdd(infinity, ~infinity) = raise undefined 
    | eAdd(~infinity, infinity) = raise undefined 
    | eAdd(e1, e2) = e1 + e2; 

3種類が可能になり、新たなデータ型があります:無限大、0、およびintは。私は0がここで重複するかもしれないと思うが、私はすべて確信していない。

パターンマッチングを使用して、2つのeIntを一緒に追加することでさまざまな種類の可能な結果を​​作成しました。


4つの異なる結果があります。 0がある場合

  • 、∞がある場合、の2の追加を返し、それ以外の
  • 未定義何も返し、∞と-∞がある場合∞
  • を返すint型
  • 他を返しますそれら

私はこのアルゴリズムは、より効率的になりたと考えることができる唯一のことは、私は二重の例を削除した場合で、かつ最後に、実行アルゴリズムを(e1、e2)から(e2、e1)に反転した後に再び行う。

これをより効率的にするためのアイデアはありますか?私はさらに多くのケースを持つ部門などの他の業務を追加する予定です。

答えて

2
  1. はい、0は、冗長です。

  2. 大文字のコンストラクタ名を使用します。

  3. Infinity of intという意味ではありません。あなたの例から判断すると、無限大が肯定的か否定的かだけに関心があるので、もかなり冗長です。

  4. 例外を使用する代わりに、オプションタイプを使用してください。要約すると

、あなたが効率的な実装をしたい場合は、IEEE 754としてあなたの整数をコード考える

datatype IntExt = PosInf 
       | NegInf 
       | Int of int 

fun extAdd (PosInf, i2) = if i2 = NegInf then NONE else SOME PosInf 
    | extAdd (i1, PosInf) = if i1 = NegInf then NONE else SOME PosInf 
    | extAdd (NegInf, _) = SOME NegInf 
    | extAdd (_, NegInf) = SOME NegInf 
    | extAdd (Int a, Int b) = SOME (Int (a+b)) 

を持っているかもしれません。

+0

こんにちはサイモン、ちょうど全体的にありがとうと言いたいと思っていました。あなたは私をたくさん助けてくれるし、あなたがしていることに本当に感謝しています。私はそれを投稿してから私の答えを改訂しました。私はあなたが持っているほとんどの変更を加えましたが、それ以上の変更があります。私は自分の質問を変更して、他の人が私が現在持っているものを見ることができるようにします唯一の違いは、このシナリオで 'NONE'と' SOME'が何をするのか尋ねることができますか? –

+0

@AndrewRaleigh:StackOverflowに関するコメントは、前後の議論にはあまり適していません。 [H&R](http://www.it.dtu.dk/introSML/)のような入門書の適切なセクションを読むことをお勧めします。または、あなたはgoogleを使うことができます:[here](http://stackoverflow.com/questions/24980801/what-are-the-options-some-and-none-sml)、[here](http://courses.cs .washington.edu/courses/cse341/04wi/lectures/10-ml-exceptions.html)(最後のリソースはかなり良いようです)。 –

+0

本のためにありがとう、私は良いものを探していた:) –

1
  • この関数には再帰がないので、「再帰」タグを削除しました。
  • 特に効率が心配な人は、最も頻繁に句を順序付けしてください。これは、あなたの "定義されていない"句が最後になることを意味します。
  • 句を選択する相対的な効率をチェックします。引数を評価して時間の半分を切り替える時間を取ることは、より短いコードからの節約を消費する可能性があります。あなたもInt 0を持っているので
+0

ありがとうございました。私はタグパターンマッチングを追加しました。間違ったタグについてはごめんね。定義されていない下位の 'eAdd(e1、e2)'は常に代わりに評価されるでしょうか?私は試みます。三点目として、それは正しく聞こえる。答えをありがとう、私はそれを感謝する:) –

+0

ああ。ダー。はい、最後にdefault句を残してください。おっとっと! :-) – Prune

関連する問題