来自Matlab和R背景,其中开发过程非常具有交互性(选择,运行选择,修复,选择,运行选择,修复等),我试图弄清楚F#如何处理这种开发风格,这在科学应用中似乎非常重要。对于刚接触F#的人来说,这里有一些事情可以立刻浮现在脑海中:
选择多行会产生与一次一行不同的结果。
let add x y = x + y
add 4.1 2.3
选择这两行会产生float -> float -> float
,而选择第一行会产生int -> int -> int
。更一般地说,matlab / R用户用于在每个语句之后打印结果,而不是在结尾处打印出来。
影子复制可能会变得很麻烦。
let file = open2GBfile('file.txt')
process file
如果一遍又一遍地交互运行,2GB文件将被复制阴影,您将很快耗尽内存。使文件可变似乎不是合适的解决方案,因为程序的最终运行永远不会改变它。
鉴于这些问题,基于fsi.exe
的系统是否不可能支持matlab / R风格的交互式开发?
[编辑:我猜测2.对象被遮蔽后会被标记为删除吗?]
答案 0 :(得分:4)
我不希望F#成为Matlab / R的直接替代品,因为与它们不同,F#是一种通用编程语言。并非特定类型工作所需的一切都在标准库中。但这并不意味着您所描述的“交互式开发”是不可能的,它可能只需要预先做一些努力来构建您所依赖的库函数。
对于#1,如前所述,在某些情况下,遗憾的是添加类型注释是必要的,但inline
关键字和“帽子类型”也可以give you duck-typing。
对于#2,我不清楚open
和process
函数的功能,以及您希望它们执行的操作。例如,open
函数可以:
FileStream
对象,您正在呼叫process
,但忘记关闭。其中一些比其他更适合您的任务。与Matlab相比R,像F#这样的通用语言为你提供了更多的方法来射击自己。但那是因为它为你提供了更多的方法来做所有事情。
答案 1 :(得分:1)
至#1
在FSI中,您必须在每个语句的末尾键入;;
并直接获得结果:
> 1 + 2;;
val it : int = 3
通常,F#-Codefile应被视为您必须以交互方式调用和评估的各个函数的集合,而不是作为生成要显示的值的一系列步骤。
至#2:
这似乎是代码本身的问题:使file
成为一个函数,因此只在真正需要的时间和地点进行读取/复制(否则将在开始时评估let绑定)。