F#中的Python风格集合

Mel*_*den 4 python collections f#

我正在尝试将我用于财务分析处理的一些python代码重构为F#,并且我很难复制一些我心爱的Python数据类型.例如在Python中,我可以愉快地声明一个这样的变量:

timeSeries = { "20110131":1.5, "20110228":1.5, "20110331":1.5, 
               "20110431":1.5, "20110531":1.5 }
Run Code Online (Sandbox Code Playgroud)

然后在函数之间抛出它,但我不知道F#中的等价物.我试过这个:

let timeSeries = ( ["20110131":1.5], ["20110228":1.5], ["20110331":1.5], 
                   ["20110431":1.5], ["20110531":1.5] )
Run Code Online (Sandbox Code Playgroud)

但当然它失败了...我知道那里的人可能会大笑起来,但我对F#很新,与Python相比它感觉更加紧缩.

我也熟悉.NET,只是F#似乎介于脚本和C#之类的"正确"语言之间,我还没有完全理解如何有效地使用它 - 一切都需要很长时间.

pad*_*pad 9

老实说,你在Python中的字典声明与你在F#中声明的内容没什么不同:

let timeSeries = dict [
             "20110131", 1.5; // ',' is tuple delimiter and ';' is list delimiter
             "20110228", 1.5;
             "20110331", 1.5; 
             "20110431", 1.5; 
             "20110531", 1.5; // The last ';' is optional
             ]
Run Code Online (Sandbox Code Playgroud)

因为:在F#中用于类型注释,所以无法重新定义它.但是您可以创建一个自定义中缀运算符,以使代码更具可读性,更接近您在Python中通常所做的操作:

let inline (=>) a b = a, b

let timeSeries = dict [
         "20110131" => 1.5;
         "20110228" => 1.5;
         "20110331" => 1.5; 
         "20110431" => 1.5; 
         "20110531" => 1.5;
         ]
Run Code Online (Sandbox Code Playgroud)

  • `=>`比内置的`更好``` 有时将元组创建与其他操作相结合是有用的,例如http://stackoverflow.com/a/7410842/162396.但对于典型情况,它只添加一个字符. (2认同)