У меня есть две функции, горизонтальная и вертикальная, для размещения элементов управления. Они работают так:
let verticalList = vertical [new TextBlock(Text = "one");
new TextBlock(Text = "two");
new TextBlock(Text = "three")]
Теперь verticalList - это элемент управления, отображающий три текстовых блока по вертикали:
one
two
three
Вот определения:
let horizontal controls =
let wrap = new WrapPanel() in
List.iter (wrap.Children.Add >> ignore) controls ;
wrap
let vertical controls =
let stack = new StackPanel() in
List.iter (stack.Children.Add >> ignore) controls ;
stack
Проблема возникает, когда я комбинирую разные типы:
let foo = vertical [new TextBlock(Text = "Title"); vertical items]
Это жалуется на то, что элементы списка не относятся к одному типу. Это правда, но у них есть общий супертип (UIElement).
Я знаю, что могу использовать:> UIElement для перекодировки обоих элементов в списке, но это уродливое решение. Может ли F # вывести общий супертип. Если нет, то почему?
Было бы замечательно, если бы красивый
vertical [X; Y; Z]
не должен становиться
vertical [(X :> UIElement); (Y :> UIElement); (Z :> UIElement)]