Map.find和Map.tryFind返回意外结果

时间:2014-05-29 14:42:40

标签: f#

这可能是显而易见的事情,但是我的头靠在墙上......

我有一个值:

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

仍然真的很感谢有人帮助澄清以前错误的例子真正发生的事情,因为由此产生的类型签名会伤害我的大脑。

1 个答案:

答案 0 :(得分:2)

正如您所说find的类型是'Key -> Map<'Key, 'T> -> 'T。所以find是一个带有两个参数的curried函数(即它是一个函数接受一个参数,然后返回另一个带另一个参数的函数)。第一个函数的类型是'Key,它是一个类型变量。

执行Map.find(DayOfWekk.Monday, dailyCandleMap)后,您只需使用一个参数调用find:包含MondaydailyCandleMap的元组。因此,在该调用中,类型变量'Key采用类型DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>。因此,find返回的函数的类型为Map<(DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>), 'T> -> 'T。也就是说,它需要一个键为DayOfWeek - Map - 元组的映射,并返回给定元组为键的值。由于没有关于'T是什么的其他信息,因此类型推断决定'Tobj