gpt4 book ai didi

f# - 函数类型的变体 wrt。接口(interface)

转载 作者:行者123 更新时间:2023-12-01 06:00:28 25 4
gpt4 key购买 nike

我正在尝试了解函数类型的变化规则。似乎他们不将输入和输出视为相同(直到对偶)。考虑这个程序。

let mk1 s = s |> Seq.iter (fun _ -> ())
// val mk1 : s:seq<'a> -> unit
let mk2 = mk1 : list<int> -> unit // Ok.

let mk3 () = [1]
// val mk3 : unit -> int list
let mk4 = mk3 : unit -> seq<int> // Type mismatch.

这是错误:

Type mismatch. Expecting a
unit -> seq<int>
but given a
unit -> int list
The type 'seq<int>' does not match the type 'int list'

据我了解seq<int>是一种接口(interface)类型,int list实现,所以我期待这个 Actor 通过(*)。

两个问题:

  1. 为什么不呢?
  2. 为什么 Actor 要制作 mk2好吗?

(*) 对于理论家:我期待阐述者在函数空间类型构造函数的输入和输出位置上表现出双重行为。错了吗?

最佳答案

你有这个:

let mk4 = mk3  : unit -> seq<int>

这不会编译,up-cast 会在输入参数中自动发生,但永远不会在函数的输出中发生。这是在spec ,第 14.4.2 节为函数和成员的使用隐式插入灵 active 。

这意味着其推断类型在参数位置包含未密封类型的 F# 函数可以在调用时传递子类型,而无需显式向上转换。

这使得定义另一个版本的函数成为可能,该版本仅限于一个子类型,这是您展示的其他情况。

关于f# - 函数类型的变体 wrt。接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980559/

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