gpt4 book ai didi

f# - 在 F# 中使用序列向上转换

转载 作者:行者123 更新时间:2023-12-04 18:08:34 24 4
gpt4 key购买 nike

我正在尝试使用 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# 通常不会在您的代码中自动插入向上转换,因此您需要添加类型注释和转换或 upcast关键字 - 我认为评论已经涵盖了所有选项。

编译器进行向上转换有两种情况 - 一种是将参数传递给函数时,另一种是创建数组或列表文字时。第二个实际上可以用来简化你的例子:

let blah<'T> : Expression list = 
[ Expression.New(typedefof<'T>)
Expression.Constant(1) ]

在这里,编译器插入向上转换为 Expression自动地。我想您的实际用例更复杂 - 当您需要使用 yield 的序列表达式时,这将不起作用,因为那时您正在编写序列表达式而不是列表文字

关于f# - 在 F# 中使用序列向上转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com