質問

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

このようなことをしたい:

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 の値を返します(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の

ポリモーフィックバリアントには、探している動的プロパティ。 OCamlとSMLは非常に近い言語です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top