動的に型指定された入力パラメーターを使用して関数を作成することは可能ですか?パターンマッチングを試しましたが、どうやらこのようには動作しません。
私はこのようなことをしたいです:
fun firstStr (0,n:string) = n
| firstStr (b:string,n:string) = if b>n then n else b;
ありがとうございました。
動的に型指定された入力パラメーターを使用して関数を作成することは可能ですか?パターンマッチングを試しましたが、どうやらこのようには動作しません。
私はこのようなことをしたいです:
fun firstStr (0,n:string) = n
| firstStr (b:string,n:string) = if b>n then n else b;
ありがとうございました。
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つの文字列を比較すると、辞書式(別名アルファベット)の比較が表示されます。それはあなたが望んでいたことですか?
少し詳しく説明すると、それぞれが文字列または整数である可能性のある2つの引数があり、2つの文字列がある場合は辞書式に小さい文字列が必要であり、1つの文字列がある場合はその文字列が必要であり、文字列を返すことができない2つの整数。職業はなんですか?タイプの値を返しますstring option
(、、option
およびSOME
http://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
。
OCamlのポリモーフィックバリアントには、探している動的プロパティが多く含まれています。必要に応じて見てみることができます。OCamlとSMLは非常に近い言語です。