2

型を持つ関数 foo’a * ’a -> int だから私はいくつかのプログラムを書いてみました:

fun foo(x,y)=6;(*here the type is ’a * ’b -> int*)
fun foo(x,x) =5; (*gives error cause of two x*)
fun foo(x,y) = if true then x else y; (give 'a * 'a -> 'a)

を取得するにはどうすればよい’a * ’a -> intですか?

ありがとう

4

5 に答える 5

1

トリックは、SML がそれらが同じ型であると推測できるような方法でxandを使用することだと思います。yリストには同じ型の要素しか含まれていないので、リストに and を入れるxy、SML にそれらが同じ型であることを伝えることができると思いました。次に、リストのサイズを計算して int を返すことができます。

fun foo(x,y) = 
    let
       val items = x::y::[]
    in
       List.length items
    end

与えるタイプ:'a * 'a -> int

于 2013-10-23T22:18:42.167 に答える
0

コレクションでこれを行うには、さらに 3 つの方法があります。

fun f1(x, y) = if false then f1(y,x) else 1

fun f2(x, y) = let val r = ref x
               in  r := y
                 ; 0
               end

fun f3(x, y) = let exception E of 'a
               in  (raise E x)
                   handle (E _) => (raise E y)
                                   handle E _ => 0
                end
于 2013-10-24T06:30:57.193 に答える
0

あなたは正しい軌道に乗っています。この問題には 2 つの部分があることを理解しているようです:xyを同じ型にするfooことと、整数を返すことを強制することです。

あなたは と親しかったfun foo (x,x) = 5;。おそらく次のような意味だと思います。

fun foo (x,y) = if x=y then 1 else 0;

これは''a * ''a -> int、非常に近いですが、必要なものではありません。''aと同じではありません'a- 1 つのダッシュは「任意の型」を意味し、2 つのダッシュは「等しいかどうか比較できる任意の型」を意味します。つまり、 と言うだけで型を制限してしまいましたx=y

型を強制的に同じにする 1 つの方法を特定しました。それは、型をif式の結果に入れることです。あとは、if( type を持つ'a) の結果を に変換するだけintです。それを式に入れるか、casetype で別の関数に渡すことでそれを行うことができます'a -> int

または、他のことを試すこともできます。リスト内のすべての要素は同じ型でなければなりません。との型を制限する別の方法がxありyます: それらを同じリストに入れます。次に、そのリストを に変換する方法を理解する必要がありintます。

于 2013-10-23T14:54:25.730 に答える
0

あなたは良いスタートを切りました:

fun foo(x,y) = if true then x else y;

したがって、関数の戻り値の型のみを変更する必要があります。Int を返す必要があります。そして、明示的な型を使用してください。

あなたの場合、例は次のようになります。

fun  foo(x :'a, y : 'a) = 1;

しかし、これは明示的な定義です。Nick Barnesによって以下に述べられているように、解決策には変数をリストに追加する必要があります。

 fun f(x,y) = let val z = [x,y] in 0 end;
于 2013-10-23T10:51:49.567 に答える
0

これは短く、追加のモジュールは必要ありません:

fun f (x, y) = 
  let val y = f (y, x) 
  in 5 end;

もちろん終了しませんが。

于 2013-10-23T22:35:46.507 に答える