2012-03-28 1 views
0

に要素を追加しますintlist内のすべての整数を追加すると、次のコードを試しました:標準ミリリットル、私は次のように定義、データ型がINTNESTと呼ばれ、標準的なMLの新しいデータ型のための機能を作りたいカスタムデータ型

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

私は間違っていますか?

EDIT:

Iは、以下を試してみました:最初のオプションは、そのint値を返し、addup(XS)はリターンへ再帰呼び出しであるよう

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

ように、xが型INTであります同じ第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 

答えて

0

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

もっと実質的には、addupに概念的な問題があります。望ましいタイプのaddupintnest -> intと思われます。したがって、intnestの値に常にaddupが適用され、intの値が返されるようにする必要があります。

ここでリストの要素のタイプを考えてみましょう。x::xsLIST of intnest listと定義したので、xintnestです。しかし、addupでは、xを整数として扱います。あなたはaddup(xs)のようにそれを処理しているものである、

同じ線に沿って

xsintnest listですが、それはintnestではありません。あなたの改訂版はxの問題を解決しますが、xsの問題は解決しません。 intnestxsからLISTに変更する必要があります。つまり、addup(LIST xs)を使用する必要があります。

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

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

+0

私はあなたを理解しませんでした、isn xs intnestのリストですか? –

+0

@ aizen92はい、まさにその通りです。しかし、あなたが必要とするタイプは、「intnest」です。あなたの 'LIST'の場合は、' intnest list'を使って実装されますが、 'intnest list'ではありません。 'xs'と' LIST xs'の型を比較す​​るのに役立ちます。 –

+0

問題は、x :: xsの間の括弧で問題になっていましたが、それはなぜ、isnt x :: xsがリストであるとみなされているのかをよく理解していませんか? –

関連する問題