質問は簡単です。
SMLでIndex変数を使用してタプルにアクセスするにはどうすればよいですか?
val index = 5;
val tuple1 = (1,2,3,4,5,6,7,8,9,10);
val correctValue = #index tuple1 ??
誰かが手伝ってくれることを願っています。前もって感謝します!
整数値とタプルを取り、その要素をタプルから抽出する関数は存在しません。もちろん、、、 ...関数はあります#1
が#2
、これらは整数引数を取りません。つまり、「関数」の名前はであり、値に適用される#5
関数ではありません。そのため、の代わりに名前を置き換えることはできません。#
5
index
5
必要な要素がタプルのどの場所にあるかを事前に知らない場合は、使用することを意図していない方法でそれらを使用している可能性があります。
'a list
タイプがより自然な値のリストが必要になる場合があります。n
次に、を使用してth要素にアクセスできますList.nth
。
少し明確にするために、なぜそれができないのか、SMLのタプルが何であるかについてもう少し知識が必要です。
タプルは、実際にはSMLのレコードとして表されます。レコードには、{id = expr, id = expr, ..., id = expr}
各識別子がラベルである形式があることに注意してください。
タプルとレコードの違いは、タプル内の要素にインデックスを付ける方法によって示されます。#1、#2、...(1, "foo", 42.0)
は(と同等の)の派生形式です{1 = 1, 2 = "foo", 3 = 42.0}
。これは、SML/NJがそのレコードに与えるタイプによっておそらくよく見られます
- {1 = 1, 2 = "foo", 3 = 42.0};
val it = (1,"foo",42.0) : int * string * real
タイプは、などのレコードタイプとして表示されないことに注意してください{1: int, 2: string, 3: real}
。タプルタイプも、レコードタイプの派生形式です。
実際#id
には関数ではないため、変数を使用して「引数」として呼び出すことはできません。これは実際には次の派生形式です(レコードパターンマッチのワイルドカードパターン行に注意してください)
fn {id=var, ...} => var
したがって、結論として、これらの派生フォーム(または構文糖衣構文)は動的ではないため、やりたくないことを実行することはできません。
1つの方法は、SebastianPaaskeがリストを使用すると言ったとおりです。欠点は、リストのn番目の要素にアクセスするためにO(n)計算が必要になることです。O(1)時間で要素にアクセスする必要がある場合は、基本的なsmlライブラリにある配列を使用できます。アレイに関する鉱石は、 http://sml-family.org/Basis/array.htmlで見つけることができます。