2017-02-14 10 views
-1

それ自身を含む他のデータ型を含むデータ型SETをループしようとしています。ループ関数を使用してそれらのデータ型を出力します。sml list [tycon mismatch]オペランドとオペレータが一致しません

fun printEXP(SET(hd::tl::[])) = 
    let  
    fun loop (hd::tl) = printEXP(hd):: loop tl | loop [] = []; 
    in() end; 
... 

私はタイコンのミスマッチエラーが発生しており、修正方法がわかりません。私のループ機能で何が間違っていますか?

operator domain: EXP list 
operand: EXP 

どこ

datatype EXP = SET of EXP list; 
+0

エラーは3行目、具体的には 'printEXP(hd)'です。これは、 'hd'がタイプEXPで、関数が' EXPリスト 'を取るためです。 – rshah

答えて

0

あなたの関数の問題は、あなたのhdEXPタイプを提供し、一方printEXPは、EXP list引数を取るということです。

これを回避するには、EXPタイプの他のものが必要です。したがって、あなたの印刷機能では、他のタイプを調べるべきです。

第2に、リストに頭と尾が含まれているかどうかをチェックするだけなので、関数は非網羅的または冗長なエラーをスローします。提供されたサンプルを見てください。例えば

datatype EXP = INT of int | SET of EXP list; 

fun printEXP (INT i) = print (Int.toString i) 
    | printEXP (SET (hd::tl)) = do main set things 
    | printEXP (SET []) = do empty set things 

希望これは

+0

-1、申し訳ありません。この関数は 'EXP'引数をとります。 ( 'SET'は' EXP list - > EXP'型のコンストラクタであることに注意してください。) 'tl'は' EXP list'型ではなく '' EXP''型であるため、実際には 'loop tl'思惑通り)。 – ruakh

+0

@ruakhしかし、問題は 'hd'で始まり、' tl'でも問題を引き起こします。そこで、私の答えで 'EXPリスト 'を正しく調べる関数を提案しました。 – rshah

+0

「hd」に問題があると思われる理由はわかりません。OPのエラーメッセージには、あなたが記述したものとは正反対のものが表示されます。 – ruakh

2

このパターンを支援します。

SET(hd::tl::[]) 

は、引数が正確に二つの要素、hdtlとリストですSET ___を意味します。 (。それはSET [hd, tl]と同等です)の代わりに

、次のように記述するためのもの:

SET(hd::tl) 

引数は、少なくとも一つの要素、hdを持つリストであるSET ___をいいます。 tlは、hd(存在する場合)の後のすべての要素のリストです。

しかし、あなたは本当に書き込みがあるはずです。

引数は xsと呼ばれる、まったくリストです SET ___を意味
SET xs 

。この時点でxsを解体する必要はありません。むしろ、あなたの内側のloop関数が分解を処理し、(もっと重要なことに)リストが空である場合も扱います。

関連する問題