F#互动开发

时间:2009-11-01 17:37:33

标签: f#

来自Matlab和R背景,其中开发过程非常具有交互性(选择,运行选择,修复,选择,运行选择,修复等),我试图弄清楚F#如何处理这种开发风格,这在科学应用中似乎非常重要。对于刚接触F#的人来说,这里有一些事情可以立刻浮现在脑海中:

  1. 选择多行会产生与一次一行不同的结果。

    let add x y = x + y
    add 4.1 2.3
    

    选择这两行会产生float -> float -> float,而选择第一行会产生int -> int -> int。更一般地说,matlab / R用户用于在每个语句之后打印结果,而不是在结尾处打印出来。

  2. 影子复制可能会变得很麻烦。

    let file = open2GBfile('file.txt')
    process file
    

    如果一遍又一遍地交互运行,2GB文件将被复制阴影,您将很快耗尽内存。使文件可变似乎不是合适的解决方案,因为程序的最终运行永远不会改变它。

  3. 鉴于这些问题,基于fsi.exe的系统是否不可能支持matlab / R风格的交互式开发?

    [编辑:我猜测2.对象被遮蔽后会被标记为删除吗?]

2 个答案:

答案 0 :(得分:4)

我不希望F#成为Matlab / R的直接替代品,因为与它们不同,F#是一种通用编程语言。并非特定类型工作所需的一切都在标准库中。但这并不意味着您所描述的“交互式开发”是不可能的,它可能只需要预先做一些努力来构建您所依赖的库函数。

对于#1,如前所述,在某些情况下,遗憾的是添加类型注释是必要的,但inline关键字和“帽子类型”也可以give you duck-typing

对于#2,我不清楚openprocess函数的功能,以及您希望它们执行的操作。例如,open函数可以:

  • 立即读取整个文件,将数据作为数组/列表/等返回,然后关闭文件
  • 返回FileStream对象,您正在呼叫process,但忘记关闭。
  • 返回序列表达式,以便您可以懒惰地遍历文件内容
  • Memoize以上某个结果,以便后续调用只返回缓存结果
  • 通过文件访问创建抽象的众多其他方法之一。

其中一些比其他更适合您的任务。与Matlab相比R,像F#这样的通用语言为你提供了更多的方法来射击自己。但那是因为它为你提供了更多的方法来做所有事情。

答案 1 :(得分:1)

至#1

在FSI中,您必须在每个语句的末尾键入;;并直接获得结果:

> 1 + 2;;
val it : int = 3

通常,F#-Codefile应被视为您必须以交互方式调用和评估的各个函数的集合,而不是作为生成要显示的值的一系列步骤。

至#2:

这似乎是代码本身的问题:使file成为一个函数,因此只在真正需要的时间和地点进行读取/复制(否则将在开始时评估let绑定)。

相关问题