首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#泛型不那么通用

F#泛型不那么通用
EN

Stack Overflow用户
提问于 2014-11-13 10:35:30
回答 1查看 170关注 0票数 2

我遇到过几次这种情况,但我真的不知道为什么会发生这种情况。

我有一个受歧视的工会,比如:

代码语言:javascript
复制
type MStep<'A, 'B> =
| Shuttle of Quotations.Expr<'B> * Quotations.Expr<'B>

工会还有更多,但这表明了基本的问题。

如果我这样做了:

代码语言:javascript
复制
let s1 = Shuttle(<@ l.SomeIntProp @>, <@ r.SomeIntProp @>)
let s2 = Shuttle(<@ l.SomeStrProp @>, <@ r.SomeStrProp @>)

我得到一个编译器错误:

这个表达式应该有int类型,但是这里有类型字符串。

同样,如果我按另一个顺序创建它们(字符串然后是int),则会得到相同的错误,但情况正好相反。

我可以看到编译器可能根据我的用法推断'B,但是如果我希望'B是真正通用的呢?

按照要求,这里有一个更完整的例子:

代码语言:javascript
复制
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 @>)
    ]
    ))

如上面所示,这会产生编译器错误。

注:

bpdbndb都是由SqlDataConnection类型提供程序提供的数据库上下文。

开放的命名空间是:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 11:17:14

问题在这里很明显:

代码语言:javascript
复制
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>

只能将相同类型的元素放入列表中。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26906808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档