3

動的に型指定された入力パラメーターを使用して関数を作成することは可能ですか?パターンマッチングを試しましたが、どうやらこのようには動作しません。

私はこのようなことをしたいです:

fun firstStr (0,n:string) = n
  | firstStr (b:string,n:string) = if b>n then n else b;

ありがとうございました。

4

3 に答える 3

10

StandardMLは、厳密な静的型付け言語です。したがって、最初のケースではintを受け入れ、2番目のケースではstringを受け入れる関数を使用することはできません。あなたが得るエラーは

this clause:        string * string -> 'Z
previous clauses:      int * string -> 'Z
in declaration:
  firstStr =
    (fn (0,<pat> : string) => n
      | (<pat> : string,<pat> : string) => if <exp> > <exp> then n else b)

文字列である1つのケースと、intである1つのケースが必要な場合は、パターンマッチングで使いやすいように設計された、新しいタイプの「タグ付き共用体」(別名「識別付き共用体」)を作成できます。 。次のようになります。

datatype Wrapper = Int    of int
                 | String of string
fun firstStr(Int 0,    n:string) = n
  | firstStr(String b, n:string) = if b>n then n else b

もちろん、このラッパータイプのより適切な名前を見つけたいと思うかもしれません。これは、プログラムのコンテキストで意味のあるものです。nまた、上の型注釈は実際には必要ないことに注意してください。書くのはもっと慣用的だろう

fun firstStr(Int 0,    n) = n
  | firstStr(String b, n) = if b>n then n else b

さらに、コンパイラーは、ケースをカバーしないままにしたことを通知します。最初の引数がゼロに等しくない整数である場合はどうなりますか?

最後に、比較の意味がはっきりしていませんb>n。2つの文字列のどの側面を比較したかったのですか?SMLで2つの文字列を比較すると、辞書式(別名アルファベット)の比較が表示されます。それはあなたが望んでいたことですか?

于 2009-11-26T21:02:43.130 に答える
7

少し詳しく説明すると、それぞれが文字列または整数である可能性のある2つの引数があり、2つの文字列がある場合は辞書式に小さい文字列が必要であり、1つの文字列がある場合はその文字列が必要であり、文字列を返すことができない2つの整数。職業はなんですか?タイプの値を返しますstring option(、、optionおよびSOMEhttp://www.standardml.org/Basis/option.htmlを参照NONE):

datatype string_or_int = String of string
                       | Int    of int 

fun firstStr(String a, String b) = SOME (if a < b then a else b)
  | firstStr(String a, Int _   ) = SOME a
  | firstStr(Int _,    String b) = SOME b
  | firstStr(Int _,    Int _   ) = NONE

関数firstStrにはタイプがあります

string_or_int * string_or_int -> string option

熟練したMLプログラマーになるための最速の方法は、最初に型について考えることを学ぶことです。たとえば、本当に必要なのが型の関数である場合string option * string -> string、自分で記述する必要はありません。組み込み関数getOptがそれを行います。一方、あなたが望むように聞こえるstring option * string -> stringので、あなたは書くことができます

fun firstStr(SOME a, b) = if a < b then a else b
  | firstStr(NONE,   b) = b

SOME結果に値コンストラクターや型は必要ありませんoption

于 2009-11-27T22:36:24.247 に答える
1

OCamlのポリモーフィックバリアントには、探している動的プロパティが多く含まれています。必要に応じて見てみることができます。OCamlとSMLは非常に近い言語です。

于 2009-11-27T21:11:39.683 に答える