0

全体的な目標は、入力した数値がフィボナッチ数であるかどうかをテストすることです。例えばisfib(100) = false isfib(8) = true

これは私が試したものです:

    fun fib a b 

これにより、すべてのフィボナッチ数が検索され、リストに追加されます。

    fun isfib(n) = 
    if n = fib 0 1 then true
    else false;

これで n のリストを検索しtrue、そこにあるかfalseどうかを返します。

コンパイルしても動作しませんが、isfib を実行するたびに、データ型エラーの不一致が発生します。これは私を夢中にさせています助けてください!

4

2 に答える 2

2

コードの問題は、の型アノテーションが入力としてisfib(n)期待され、入力として意図したときに出力として返されることです。これが、オペレーターが同意しないというエラーメッセージを表示する理由です。つまり、それは期待していますが、受け取りました。int listbooleanintint listint

から生成されたフィボナッチ数のに存在することList.existsを確認するために使用できます。nlistfib 0 1

fun isfib(n) = List.exists (fn x => x = n) (fib 0 1);

isfib(8);
val it = true : bool
isfib(100);
val it = false : bool
于 2013-02-14T02:08:22.497 に答える
1

関数の型定義に注意を払うことをお勧めします。

val fib = fn : int -> int -> int list
val isfib = fn : int list -> bool

それによるとisfib、引数として整数のリストを期待していますが、整数を渡そうとしています。

タイプに注意する必要があります。MLは暗黙的に型指定された言語ですが、型を明示的に割り当てると時間を節約できます。

明示的に定義された型を使用してプログラムを書き直してみましょう。

fun fib (a:int,  b:int) =
  if b + a + b < 40000000
  then (a + b) :: fib (b, (a + b))
  else [a + b];

fun isfib (n: int) =
  if n = fib (0, 1) then true
  else false;

プログラムをビルドしようとすると、コンパイラは実際に問題を引き起こす式を指し示しますn = fib (0,1)。関数のfib定義から、が返されることがわかりますint list。あなたの場合ですnintしたがって、ここでの問題は、整数を整数のリストと比較しようとしていることです。これを排除するには、アイテムがリストにあるかどうかを判別する関数を作成する必要があります。

List.existsPS構造体から関数を使用することもできますがList、最初に独自の関数を作成することをお勧めします。

于 2013-02-14T02:08:34.493 に答える