这可能是显而易见的事情,但是我的头靠在墙上......
我有一个值:
dailyCandleMap : Map<DayOfWeek, List<TimeSpan * TimeSpan> option>
我确保一周中每天的密钥都存在,所以我应该能够安全地使用Map.find来检索给定日期的List<TimeSpan * TimeSpan> option
。我尝试了以下内容:
let candlesForMonday = Map.find(DayOfWeek.Monday, dailyCandleMap)
但是将鼠标悬停在candlesForMonday
的类型上,编译器会告诉我它是
(Map<(DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>), obj> -> obj)
这是什么意思,如果给出Map.find的签名是'Key -> Map<'Key,'T> -> 'T
怎么可能呢?
let candlesForMonday = Map.find DayOfWeek.Monday dailyCandleMap
仍然真的很感谢有人帮助澄清以前错误的例子真正发生的事情,因为由此产生的类型签名会伤害我的大脑。
答案 0 :(得分:2)
正如您所说find
的类型是'Key -> Map<'Key, 'T> -> 'T
。所以find
是一个带有两个参数的curried函数(即它是一个函数接受一个参数,然后返回另一个带另一个参数的函数)。第一个函数的类型是'Key
,它是一个类型变量。
执行Map.find(DayOfWekk.Monday, dailyCandleMap)
后,您只需使用一个参数调用find
:包含Monday
和dailyCandleMap
的元组。因此,在该调用中,类型变量'Key
采用类型DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>
。因此,find
返回的函数的类型为Map<(DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>), 'T> -> 'T
。也就是说,它需要一个键为DayOfWeek
- Map
- 元组的映射,并返回给定元组为键的值。由于没有关于'T
是什么的其他信息,因此类型推断决定'T
为obj
。