繁体   English   中英

F#互动开发

[英]F# interactive development

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

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

     let add xy = x + y add 4.1 2.3 

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

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

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

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

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

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

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

对于#1,如前所述,在某些情况下,不幸地需要添加类型注释,但inline关键字和“帽子类型”可以为您提供鸭子类型

对于#2,我不清楚你的openprocess功能做什么,而不是你想要他们做什么。 例如, open函数可以:

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

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

到#1

在FSI中,你必须输入;; 在每个语句的末尾,直接得到结果:

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

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

到#2:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM