如何创建包含具有公共超类的对象的F#列表?
我有两个功能,水平和垂直,用于布局控件。他们的工作方式如下:
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)]
没有找到相关结果
已邀请:
3 个回复
目浆搽
animals1:在var声明中键入注释,向上转换每个元素 animals2:在列表表达式上键入注释,向上转换每个元素 animals3:第一个元素的显式类型,upcast rest 在F#的未来版本中,上传很可能变得不必要。 (另见http://cs.hubfs.net/forums/thread/9953.aspx,但没有'新'那里。)
铰齐插
然后你就可以这样使用它:
例如在你的垂直功能内。
漂汀拦
最后几乎肯定是滥用操作员,除非你处于一个非常专业的领域,你经常需要这样的强制,你愿意牺牲固有的可读性来实现简洁。