gpt4 book ai didi

f# - F# 中的类型定义和类型推断

转载 作者:行者123 更新时间:2023-12-02 11:58:32 25 4
gpt4 key购买 nike

我有两个示例类型,按以下顺序定义:

type Quote = {QuoteNum: decimal option; ShipToID: decimal option}
type Sales = {SalesNum: decimal option; ShipToID: decimal option}

我正在尝试编写一个可以接受两种类型的函数:

let fx (y: Map<decimal option, _ list>) = 
y
|> Map.map (fun key list -> list
|> List.map (fun x -> x.ShipToID))

当我尝试通过Map<decimal option, Quote list>时对于该函数,我收到错误:

Type mismatch. Expecting a
Map<decimal option,Sales list>
but given a
Map<decimal option,Quote list>

我本以为我能够将两种类型的映射传递给函数,但编译器似乎推断只有 Map<decimal option, Sales list>是函数可以接受的。我怀疑编译器“看到”了 Sales最近键入并假设这就是函数所需要的。我以为我通过包含 _ 使该函数相对通用。在类型注释中。

如何使函数接受这两种类型?我可以在不重新定义类型本身的情况下执行此操作吗?

最佳答案

你的怀疑是正确的。 F# 需要推断单个具体类型,因此将使用它找到的最新匹配类型。

您可以通过使用 ShipToID 字段定义一个接口(interface)并让两种类型实现它(不确定这是否算作为您重新定义类型),或者通过提供用于提取的 getter 函数来使其工作字段值(这将使您保持函数的通用性):

let fx (shipToIdGetter: 'a -> decimal option) (y: Map<decimal option, 'a list>) = 
y
|> Map.map (fun key list ->
list
|> List.map (fun x -> shipToIdGetter x))

如果 F# 支持行多态性(OCaml 恰好就是这种情况),您的代码将按编写的方式工作。

关于f# - F# 中的类型定义和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39474202/

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