【发布时间】:2013-11-19 14:19:44
【问题描述】:
我正在尝试使用 F# 中的表达式(System.Linq.Expression 类型)。这是我遇到的问题的一个简单示例:
let blah = seq {
yield Expression.New(typedefof<'T>)
yield Expression.Constant(1)
}
我希望blah 成为seq<Expression>。然而,该序列通过第一个产量推断其类型,即NewExpression。这将导致第二个 yield 导致编译失败,因为它是 ConstantExpression。一个可行的解决方案是向上转换所有收益:
let blah = seq<Expression> {
yield Expression.New(typedefof<'T>) :> Expression
//or
yield upcast Expression.Constant(1)
}
但这感觉很笨拙,每次都必须向上转换。我认为灵活的类型也可能是一个可能的解决方案,但我也遇到了麻烦。 seq<#Expression> 似乎不起作用。
有没有一种方法可以生成一系列表达式而不必向上转换每个表达式?
【问题讨论】:
-
F# 在大多数情况下不会隐式向上转换,所以我不认为向上转换关键字笨拙,但我也不知道是否有不同的方法。
-
我认为this question 也涵盖了您的情况,特别是如果您不需要序列 但可以使用数组或列表,您可以添加a type annotation and it should work。 ..
-
虽然这是一个简单的示例,但使用序列对我来说有其优势,因为我将使用
yield!,但也许列表是一个可行的解决方案。这个答案也帮助我理解了为什么 F# 编译器对这个主题有点好笑。 -
一个更易读的变体:
let blah = seq<Expression> { yield Expression.New(typedefof<'T>) :> _ ; yield Expression.Constant(1) :> _ }
标签: f#