2016-11-18 20 views
0

私は、引数としてリストを取る関数 'check()'を書く必要がある学校の仕事があります。このリストには3つの要素があります。リストの最初の要素は演算子で、他の2つの要素はデータ型でなければなりません。関数呼び出しの例は、次のようになります。スキーム - カスタムデータ型?

(check '(+ int int)) 

ここでは、LITERALLYと言うべきです。関連する数字はありません。この関数は、操作で使用するデータ型の種類に応じて、出力される正しいデータ型を戻す必要があります。例:

(check '(+ int int)) 

はintを返す必要があります。

また、言う: 「あなたのプログラムは
'+'、演算子を認識すべきである ' - '、 '*'、 '/'、 '商'、 '<'、 '>'、 '='、 「と、」または」 とデータ型: 『INT』、 『ブール』と 『本当の』

テスト実行の例は次のようになります。

> (check '(+ int int)) 
int 
> (check '(* int bool)) 
The operator '*' does not accept bools! 
> (check '(= (< (+ int int) (quotient int int)) (> int int))) 
bool 
> (check '(* int (+ real int))) 
The operator '+' must have operands of the same numerical type! 

をこのタスクはで連れて行ってくれました私がSchemeで本当にカスタムデータ型を作ったことがないのは驚きです。一般的には魅力的です)。私は現在どこから始めるべきか、何をすべきか分かりません! int、bool、realを定義する必要がありますか?演算子を定義する必要はありますか?もしそうなら...どう?誰か助けてくれますか?私にどのようなプロセスを開始するか、どのようなプロセスを見せるかを教えてください。

+0

質問に一貫性がありません。一例では、 '( - int real)'は 'real'を返しますが、もう一つの例で'(+ real int) 'は' real'を返す代わりにエラーを投げます。これはおそらく偽です。 –

+0

@ ChrisJester-Youngああ、気付かなかった。私の悪い。テスト実行出力は正しいものです。私の投稿を編集してください。 – Schytheron

答えて

0

この質問はカスタムデータ型ではありません。それは学生が回帰について考えるようにするための唯一のフレーミングデバイスです。

基本的に、最も基本的な部分が残されるまで、再帰は小さな問題と小さな問題に分解されます。この型チェック関数の場合は、(= (< (+ int int) (quotient int int)) (> int int))のような入力に直面しており、出力をboolのように減らす必要があります。

これを解消する方法は、上記のような大きな入力を(= A B)(Aは(< (+ int int) (quotient int int))、Bは(> int int))と等価であると考えることです。

次に、Aを(< C D)に分解します.Cは(+ int int)、Dは(quotient int int)です。次に、質問に記載されているルールを適用します。具体的には、次の規則が適用されます

  • C = (+ int int)int
  • D = (quotient int int)int
  • A = (< C D)(< int int)bool
  • B = (> int int)bool
  • (= A B)(= bool bool)bool

最も基本的な部分(int,、bool)になるまで、問題を小さくして小さくする手順を参照してください。それは一言で言えば再帰です。

私は、この問題の解決に役立つことを願っています。

+0

これを構造化するためのヒントはありますか?私がどこから始めたらいいのか、どのようにプロセスを考えるべきか? – Schytheron

+1

問題を再帰的に解決するための鍵は、同じ一般的な手順*が適用される小さな問題の集合に分解することができることを認識することです。それらのサブ問題の解決策からこのように作成されたサブ問題のそれぞれが「より小さい」ということは、最終的にベースケースに到達することを保証する。私がそれを完全に打ち破らなければならないのなら、それはすべて私の仕事です。私にとっては、再帰はできるだけ少ない精神的な仕事をすることです。再帰が基本ケースを単独で見つけることを許可します。 –

関連する問題