F# 查找不确定类型的对象

F# 查找不确定类型的对象,f#,type-inference,F#,Type Inference,我正试图弄明白为什么这个不能编译 type A() = member __.M(f:DateTime -> seq<int>) = () member __.M(f:DateTime -> obj) = () let a = A() a.M(fun d -> seq [d.Year]) // 'd' is indeterminate type type A()= 成员(f:DateTime->seq)=() 成员(f:DateTime->obj)=()

我正试图弄明白为什么这个不能编译

type A() =
  member __.M(f:DateTime -> seq<int>) = ()
  member __.M(f:DateTime -> obj) = ()

let a = A()
a.M(fun d -> seq [d.Year]) // 'd' is indeterminate type
type A()=
成员(f:DateTime->seq)=()
成员(f:DateTime->obj)=()
设a=a()
a、 M(fund d->seq[d.Year])/“d”是不确定类型

如果我删除了第二个重载或向
d
添加了类型注释,它就会这样做。是因为重载解析的某些方面发生在类型检查之前吗?

是的,基本上重载使类型推断变得困难。在本例中,您似乎希望编译器对类型
DateTime->seq
DateTime->obj
进行某种泛化,以获得
DateTime->?
,然后从那里开始,但我认为它从来没有做过那种“反统一”的工作。

是的,重载基本上使类型推断变得困难。在本例中,您似乎希望编译器对类型
DateTime->seq
DateTime->obj
进行某种泛化,以获得
DateTime->?
,然后从那里开始,但我认为它从来没有做过那种“反统一”的事情,但是我想知道为什么类型注释会把事情弄清楚。我想它可以继续分析
f
的返回类型,从而找到匹配项?@Daniel-我认为这是对的-如果添加注释,则内部lambda的类型为
DateTime->seq
,推理可以正确选择重载;如果删除其中一个重载,那么
M
是唯一的,类型信息可以流入lambda来约束
d
的类型。我一直在考虑这些问题,但不知道为什么类型注释会清除这些内容。我想它可以继续分析
f
的返回类型,从而找到匹配项?@Daniel-我认为这是对的-如果添加注释,则内部lambda的类型为
DateTime->seq
,推理可以正确选择重载;如果删除其中一个重载,则
M
是唯一的,类型信息可以流入lambda以约束
d
的类型。