【问题标题】:Map.find and Map.tryFind returning unexpected resultsMap.find 和 Map.tryFind 返回意外结果
【发布时间】:2014-05-29 23:18:09
【问题描述】:

这可能是显而易见的事情,但我的头在这里撞到了墙上......

我有一个价值:

dailyCandleMap : Map<DayOfWeek, List<TimeSpan * TimeSpan> option>

我确保了一周中每一天的密钥都存在,因此我应该能够安全地使用 Map.find 检索给定日期的List&lt;TimeSpan * TimeSpan&gt; option。我尝试了以下方法:

let candlesForMonday = Map.find(DayOfWeek.Monday, dailyCandleMap)

但是将鼠标悬停在 candlesForMonday 的类型上,编译器告诉我它是

(Map<(DayOfWeek * Map<DayOfWeek, List<TimeSpan * TimeSpan> option>), obj> -> obj)

这到底是什么意思?鉴于 Map.find 的签名是'Key -&gt; Map&lt;'Key,'T&gt; -&gt; 'T,这怎么可能?

编辑:当我更多地玩这个时,我发现它与咖喱表单/部分应用程序以及我调用该函数的方式有关。这样做会给我预期的结果:

let candlesForMonday = Map.find DayOfWeek.Monday dailyCandleMap

仍然非常感谢有人帮助澄清上一个错误示例的真正原因,因为生成的类型签名伤害了我的大脑。

【问题讨论】:

    标签: f#


    【解决方案1】:

    正如你所说,find 的类型是'Key -&gt; Map&lt;'Key, 'T&gt; -&gt; 'T。所以find 是一个带两个参数的柯里化函数(即它是一个带一个参数然后返回另一个带另一个参数的函数)。第一个函数的类型是'Key,是一个类型变量。

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

    【讨论】:

    • 非常感谢!我的 F# 已经好很多了,但有时我在正确阅读这些签名方面仍然很弱。必须记住 -> 在查看这些时的含义
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多