我一直在研究使用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
当我需要快速预处理某些数据或在各种格式之间转换数据时,我以类似的方式使用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#中很好地完成.