gpt4 book ai didi

f# - 类型定义中的 Seq 约束

转载 作者:行者123 更新时间:2023-12-02 07:54:27 25 4
gpt4 key购买 nike

此类型定义有效:

type Model<'t,'u when 't :> seq<'u> >(query: unit -> 't) = class end

但是,对于我来说'u这里是多余的,但下一个定义:

type Model<'t when 't :> seq<_> >(query: unit -> 't) = class end

产生错误:

Anonymous type variables are not permitted in this declaration - F# Compiler (715)

紧凑

最紧凑的形式:

type Model<'t>(query:unit -> #seq<'t>) = class end

在实例创建期间:

Query.users |> Model

产生错误:

Type constraint mismatch. The type unit -> (string * int) list
is not compatible with type unit -> 'a
F# Compiler (193)

可能,因为这里描述的Why are flexible types not allowed in record type definitions? 。但无论如何,错误描述对我来说不清楚,替换 (string * int) list 有什么问题吗?而不是'a

背景

真实类型Model是数据库查询的包装器,它实现 INotifyPropertyChanged并包含mutable类型状态Outcome :

type 't Outcome =
| Empty
| Loading
| Success of 't
| Fault of string * string

#seq<'t>需要类型约束来检测 Empty案例 Seq.isEmpty由于查询可以以通用方式返回 seqlistarray

最佳答案

正如 @kvb 所解释的,问题是你不能有泛型构造函数 - 因此你可以向整个类引入一个新的类型参数(就像你在第一个示例中所做的那样),或者返回类型 query只需要 seq<'t> (正如编译器强制您在其他示例中所做的那样)。

如果您想将内容封装在类中,一个不错的技巧是将构造函数设为私有(private)并添加静态 Create方法可以具有您需要的额外通用参数:

type Model<'t> private(query:unit -> seq<'t>) = 
static member Create(query:unit -> #seq<'t>) =
Model(fun () -> query () :> _)

关于f# - 类型定义中的 Seq 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873996/

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