ML!!!!!!
■ このスレッドは過去ログ倉庫に格納されています
0194デフォルトの名無しさん
NGNG部分適用で多相的な関数を宣言するのはSML97では無理じゃないかな?
val get_third' = (fn l => get_nth 3 l) とか、これに同値な宣言
fun get_third' l = get_nth 3 l
なら'a list->'aになりますが...というのは:
SML97にはvalue polymorphismというものが導入されました。これは、「宣言
val x = eのxが多相型を持つのはeがnon-expansiveな式であるときに限る」と
いうものです。
non-expansiveな式とはおおざっぱにいって定数、変数、関数抽象、
non-expansiveな式からなるタプルやレコード、そしてnon-expansiveな式が与
えられたコンストラクタ(refを除く)からなります。それ以外、例えば関数呼
び出しはnon-expansiveではありません。
>>190でWarningが出るのは、get_thirdの型を多相的にしようとしたところ、
get_nth 3がnon-expansiveな式ではなかったためです。一方冒頭の例では
non-expansiveな式でget_third'を宣言しているのでうまくいきます。
できなかった時にget_thirdの型がどうなるか、については省略します。ただ
し、SML/NJとMosmlでは扱いが微妙に異なるため>>190のように挙動が違います。
ちなみにMosmlでget_thirdを定義してget_third [1,2,3]を計算した後
get_thirdの型を見ると...
■ このスレッドは過去ログ倉庫に格納されています