F#声明变量而不实例化它

时间:2015-04-28 12:30:22

标签: f# scope initialization instantiation declare

我需要在F#中声明一个变量而不实例化它。这在C#中很简单,但在F#中,我只有val关键字,并且只能在类中使用。有没有办法为范围目的声明一个变量,但是为了以后保留初始化?

编辑:回答费奥多尔的问题:

我想以编程方式浏览带有C#序列化文件的文件夹,每个文件都包含A类或B类对象的数组。每个对象都有一个时间戳,每天有一个C#数组文件。因此,让我们假设总共有20个文件(10个A文件和10个B文件),并且在每个文件中,有1000个A对象或1000个B对象,每个对象都有一个时间戳,每个文件收集1000个每天的数据点。

问题是A类文件和B类文件在一天中的不同时间点开始和停止,所以我不能选择Day1A和Day1B,合并它们,然后选择Day2A和Day2B,依此类推。我需要经历Day1A和Day1B,直到其中一个完成(比如A先完成),然后加载Day2A并比较Day2A和Day1B,直到其中一个完成,等等。

为此,我需要枚举每个文件中的1000个对象以及文件本身。我还需要处理奇怪的情况,其中没有类型A或类型B左(在这种情况下,我只是枚举剩余的类型)。

范围发挥作用,因为我有两组枚举器通过两组while循环。

2 个答案:

答案 0 :(得分:4)

在F#中实际需要这种情况的情况很少。最有可能的是,你可以找到另一种(更实用,更惯用)的方式。

例如,在C#中,如果要使用if初始化变量,则可能经常需要为范围声明变量:

int some;  
if (Condition()) { some = 1; }
else { Console.WriteLine("yay"); some = 2; }

但是你不需要在F#中这样做,因为if是一个表达式:

let some = 
  if Condition() then 1
  else
    Console.WriteLine("yay")
    2

所以,如果你描述了你所面临的具体情况,你可能会得到一个更有用的答案,用一个更好的惯用F#解决方案。

答案 1 :(得分:3)

F#中的值是不可变的,因此无法更改该值。因此,没有办法直接做你想做的事。

相反,人们通常会创建一个“ref cell” - 变量的容器 - 它允许更改值的内容。但是,您仍需要初始化单元格。 (有关示例,请参阅链接。)

最好是重构代码以避免需要(并非总是可行,但F#有足够的语法,这可能远远超过像C#这样的命令式语言。)