有用的F#脚本

Rus*_*ell 6 scripting f#

我一直在研究使用F#进行开发,并且发现(对于我的情况)构建脚本以帮助我简化一些复杂的任务,我可以从中获得价值(目前).

我最常见的复杂任务是连接许多任务的文件(主要是SQL相关的).

我经常这样做,每次我尝试改进我的F#脚本来做到这一点.

到目前为止,这是我的最大努力:

open System.IO

let path = "C:\\FSharp\\"
let pattern = "*.txt"
let out_path = path + "concat.out"

File.Delete(out_path)
Directory.GetFiles(path, pattern)
 |> Array.collect (fun file -> File.ReadAllLines(file))
 |> (fun content -> File.WriteAllLines(out_path, content) )
Run Code Online (Sandbox Code Playgroud)

我确信其他人都有脚本,这使得他们有时候复杂/无聊的任务更容易.您曾经使用过哪些F#脚本或者您认为F#脚本的其他用途有用吗?

我发现改善F#的最佳方法是浏览其他脚本以获得有关如何处理特定情况的想法.希望这个问题将来会帮助我和其他人.:)

我发现了一篇关于生成可能感兴趣的F#脚本的文章:http: //blogs.msdn.com/chrsmith/archive/2008/09/12/scripting-in-f.aspx

Tom*_*cek 6

当我需要快速预处理某些数据或在各种格式之间转换数据时,我以类似的方式使用F#.F#具有很大的优势,您可以创建更高阶的函数来执行各种类似的任务.

例如,我需要从SQL数据库加载一些数据并生成加载数据的Matlab脚本文件.我需要为几个不同的SQL查询执行此操作,因此我编写了这两个函数:

// Runs the specified query 'str' and reads results using 'f'
let query str f = seq { 
  let conn = new SqlConnection("<conn.str>");
  let cmd = new SqlCommand(str, conn)
  conn.Open()
  use rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
  while rdr.Read() do yield f(rdr) } 

// Simple function to save all data to the specified file
let save file data = 
  File.WriteAllLines(@"C:\...\" + file, data |> Array.ofSeq)
Run Code Online (Sandbox Code Playgroud)

现在我可以轻松编写特定的调用来读取我需要的数据,将它们转换为F#数据类型,进行一些预处理(如果需要)并将输出打印到文件中.例如,对于处理公司我有类似的东西:

let comps = 
  query "SELECT [ID], [Name] FROM [Companies] ORDER BY [ID]" 
        (fun rdr ->  rdr.GetString(1) )
let cdata = 
  seq { yield "function res = companies()"
        yield "  res = {"
        for name in comps do yield sprintf "   %s" name
        yield "  };"
        yield "end" }
save "companies.m" cdata
Run Code Online (Sandbox Code Playgroud)

将输出生成为字符串序列也非常简洁,尽管您可以使用编写更高效的计算构建器StringBuilder.

另一个以交互方式使用F#的例子在我的第13章的函数式编程书中有描述(你可以在这里获得源代码).它连接到世界银行数据库(其中包含大量有关各国的信息),提取一些数据,探索数据结构,将其转换为F#数据类型并计算一些结果(并将其可视化).我认为这是(很多)任务之一,可以在F#中很好地完成.