我遇到过几次这种情况,但我真的不知道为什么会发生这种情况。
我有一个受歧视的工会,比如:
type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>工会还有更多,但这表明了基本的问题。
如果我这样做了:
let s1 = Shuttle(<@ l.SomeIntProp @>, <@ r.SomeIntProp @>)
let s2 = Shuttle(<@ l.SomeStrProp @>, <@ r.SomeStrProp @>)我得到一个编译器错误:
这个表达式应该有int类型,但是这里有类型字符串。
同样,如果我按另一个顺序创建它们(字符串然后是int),则会得到相同的错误,但情况正好相反。
我可以看到编译器可能根据我的用法推断'B,但是如果我希望'B是真正通用的呢?
按照要求,这里有一个更完整的例子:
type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>
| Ident of Quotations.Expr<'B>
| Trans of Quotations.Expr<'A> * Quotations.Expr<'B> * ('A -> 'B)
let doMig (f:Table<'A>, t:Table<'B>, s:('A * 'B -> MStep<'C, 'D> list)) =
ignore()
let a = doMig(bpdb.Adjustments, ndb.Adjustments, (fun (l,r) ->
[
Shuttle(<@ l.Id @>, <@ r.Id @>)
Shuttle(<@ l.Name @>, <@ r.Name @>)
]
))如上面所示,这会产生编译器错误。
注:
bpdb和ndb都是由SqlDataConnection类型提供程序提供的数据库上下文。
开放的命名空间是:
open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq
open System.Xml
open System.Xml.Linq
open Microsoft.FSharp.Quotations.Patterns
open System.Reflection
open System.Diagnostics发布于 2014-11-13 11:17:14
问题在这里很明显:
let t = [ //inserted t to have a concrete variable
Shuttle(<@ l.Id @>, <@ r.Id @>);
Shuttle(<@ l.Name @>, <@ r.Name @>)
]t的确切类型是什么。第一个元素给出MStep<_,int> list,第二个元素给出不同的MStep<_,string>。
只能将相同类型的元素放入列表中。
https://stackoverflow.com/questions/26906808
复制相似问题