0

標準 ML で新しいデータ型の関数を作成したいのですが、データ型は intnest と呼ばれ、次のように定義されます。

datatype intnest = 
  INT of int
| LIST of intnest list;

intlist のすべての整数を追加する関数を作成したいので、次のコードを試しました。

fun addup (INT n) = n
  | addup (LIST x::xs) = x + addup(xs);

私は何を間違っていますか?

編集:

私も次のことを試しました:

fun addup (INT n) = n
  | addup (LIST x::xs) = addup(x) + addup(xs);

x は INT 型であるため、最初のオプションはその int 値を返し、addup(xs) は同じ 2 番目のオプションを返すための再帰呼び出しです。

次のことも試しました:

fun addup (INT n) = n
  | addup (LIST []) = 0
  | addup (LIST x::xs) = addup(x) + addup(LIST xs);

しかし、次のエラーが表示されます。

stdIn:146.4-151.50 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
  this clause:      intnest list -> 'Z
  previous clauses:      intnest -> 'Z
  in declaration:
    addup =
      (fn INT n => n
        | LIST nil => 0
        | :: (<pat>,<pat>) => addup <exp> + addup <exp>)
stdIn:151.25-151.50 Error: operator and operand don't agree [tycon mismatch]
  operator domain: intnest
  operand:         intnest list
  in expression:
    addup x
4

1 に答える 1

0

まず、LISTケースに構文エラーがあります。を取り除きofます。ケースは次のようになりますaddup (LIST(x::xs)) = ...

さらに重要なことに、 には概念上の問題がありaddupます。の目的のタイプは のaddupようintnest -> intです。したがって、が常に値と戻り値addupに適用されるようにする必要があります。intnestint

リストの要素の型を考えてみましょうx::xs。あなたはそれを と定義したLIST of intnest listのでxintnestです。しかし では、整数としてaddup扱います。x

同じように、xsはですが、それは ではありintnest listません。改訂版では の問題は解決されていますが、 では解決されていません。を使用して を作成する必要があります。つまり、 を使用する必要があります。intnestaddup(xs)xxsintnestxsLISTaddup(LIST xs)

最後に、ケースがありません。持っているとどうなりますLIST []か?

必要な括弧がないため、3 番目のバージョンは機能しません。intnest listコンパイラは、ケースの 1 つ (ケース) としてa を使用していることを伝えています::。つまり、 と見えLIST x::xsます(LIST x) :: xs

于 2012-03-28T09:11:23.733 に答える