Array.map2で理解できない何かに遭遇しました。
このコードを考えてみましょう:
type r1 = {
v1 : int
X : int
}
type r2 = {
v1 : int
Y : int
}
let a1 = [|{v1=1; X=1}; {v1=2; X=2}|] // val a1 : r1 [] ...
let a2 = [|{v1=100; Y=100}; {v1=200; Y=200}|] // val a2 : r2 [] ...
Array.map2 (fun x1 x2 -> (x1.X, x2.Y)) a1 a2 // works as expected
Array.map2 (fun x1 x2 -> (x1.v1, x2.v1)) a1 a2 // error FS0001: Type mismatch. Expecting a r2 [] but given a r1 []
両方のレコードにフィールドがありますv1
。最後の行では、の値のタプルを取得しようとしていますがv1
、さまざまなレコードタイプr1
とr2
。異なるレコードで同じ名前のフィールドを選択しようとすると、エラーがスローされるようです。
x1
どういうわけかそれはタイプでなければならないという結論にジャンプしますr2
、なぜ2行目は2つのパラメータからタイプを推測しないのa1
ですa2
か?
編集
これで修正されますが、パラメーターからタイプを正しく取得することを期待します。
Array.map2 (fun (x1:r1) x2 -> (x1.v1, x2.v1)) a1 a2 // works