SML / NJ-動的な入力のパターンマッチング
-
05-07-2019 - |
質問
動的に型指定された入力パラメーターを使用して関数を作成することは可能ですか? パターンマッチングを試しましたが、どうやらこのようには動作しません。
このようなことをしたい:
fun firstStr (0,n:string) = n
| firstStr (b:string,n:string) = if b>n then n else b;
ありがとう。
解決
StandardMLは、厳密に静的に型付けされた言語です。したがって、最初の場合はintを受け入れ、2番目の場合は文字列を受け入れる関数を使用できません。表示されるエラーは
です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つのケースが必要な場合は、&quot; タグ付きユニオン&quot; (別名「差別化された結合」)、パターンマッチングで使いやすいように設計されています。次のようになります。
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
もちろん、このWrapperタイプに対してより適切な名前を見つけることもできます。これは、プログラムのコンテキストで意味のある名前です。また、 n
の型注釈は実際には必要ないことに注意してください。書く方が慣用的でしょう
fun firstStr(Int 0, n) = n
| firstStr(String b, n) = if b>n then n else b
さらに、コンパイラは、ケースがカバーされていないことを通知します:最初の引数がゼロでない整数の場合はどうなりますか?
最後に、比較 b&gt; n
の意味が明確ではありませんが、2つの文字列のどの側面を比較したいですか? SMLの2つの文字列を比較すると、辞書式(別名アルファベット)の比較が表示されます。それはあなたが望んだものですか?
他のヒント
少し詳しく説明すると、2つの引数があり、それぞれが文字列または整数であり、2つの文字列がある場合は辞書編集的に小さい文字列が必要であり、1つの文字列が必要な場合はその文字列、 2つの整数がある場合、文字列を返すことはできません。職業はなんですか?タイプ string option
の値を返します( SOME
、および NONE
を検索します) http://www.standardml.org/Basis/option.html "rel =" noreferrer "> http://www.standardml.org/Basis/option.html ):
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-&gt;型の関数だった場合文字列
、自分で書く必要はありません。組み込み関数 getOpt
がそれを行います。一方、 string option * string-&gt;が必要なようです。文字列
、あなたが書くことができます
fun firstStr(SOME a, b) = if a < b then a else b
| firstStr(NONE, b) = b
そして、結果に SOME
値コンストラクターまたは option
タイプが必要ではありません。
ポリモーフィックバリアントには、探している動的プロパティ。 OCamlとSMLは非常に近い言語です。