私は SML が初めてで、タプルのリストで要素を取得する方法を知りたいと思っていました。たとえば、リスト[("abc", 4), ("def", 6)]
では、どのように抽出できます"abc"
か? 私はもう試した
x::xs => #1(x)
しかし、「未解決のフレックスレコード」が引き続き表示されます。助言がありますか?
私は SML が初めてで、タプルのリストで要素を取得する方法を知りたいと思っていました。たとえば、リスト[("abc", 4), ("def", 6)]
では、どのように抽出できます"abc"
か? 私はもう試した
x::xs => #1(x)
しかし、「未解決のフレックスレコード」が引き続き表示されます。助言がありますか?
あなたが抱えていたエラーは、のようなもの#1
は一種の特別なものであり、そのタイプはそれが使用されるものに依存するためです. たとえば#1 (1,2)
、 のタイプは#1
です'a * 'b -> 'a
。一方#1 (1,2,3)
、 のタイプは#1
です'a * 'b * 'c -> 'a
。すべてに対して機能するような型はありません'a * ... -> 'a
。そのため、コンパイラは、それが使用される型 (基本的に、タプルに含まれる要素の数) を把握できなければなりません。
したがって、これは機能しません:
fun f lst =
case lst of x::xs => #1 x
| [] => "The list is empty"
x
それが「ある種のリスト」であり、 「何らかのタイプの何らかの値」であることを知っているからです。しかし、それがどんな種類のタプルかはわかりません。
型ガード、またはコンパイラがタプルの種類を認識できるようにするその他のコンテキストを追加するだけで機能します。
fun f (lst : (string * 'a) list) =
case lst of x::xs => #1 x
| [] => "The list is empty"
私はこのようにそれを抽出します:
fun foo ((x,y)::xs) = x;
リストからタプルを抽出して と にバインドx
しabc
、y
を4
返すようにしx
ます。そのように、タプルをマージして、文字列のみのリストを取得することもできます:
fun f [] = []
| f ((x,y)::xs) = x ^ Int.toString(y) :: f(xs);
list を指定すると、リスト[("abc",4),(def",6)]
を返します["abc4","def6"]
パターンマッチングを使用して抽出するだけです。
let
val lst = [("abc", 4), ("def", 6)]
in
case lst of (str,_)::xs => str
| [] => "The list is empty"
end
戻り"abc"
ます。
次のようなタプル値を取得する関数を使用できます。
fun getname(name:string, x:int) = name;
リストがある場合:
val lst = [("abc", 4), ("def", 6)]
次に、次のようにして、最初のタプル (hd) の名前を抽出できます。
getname(hd lst)
戻ります"abc"