我一直在尝试使用Deedle F#Library编写一个F#批处理程序.它运作得很好.但是,我不确定以下两项任务的最佳设计:
将F#模块组合到现有的ASP.net MVC/Web Api系统中
创建一个WPF接口,作为各种F#模块的控制面板和可视依赖控制器.
F#模块正在执行的任务类型是处理时间序列并应用统计过程来推导新的时间序列.
我一直在尝试为现有模块创建一个类包装器,因此可以从C#代码中调用它.我从C#Deep Dive中读到,这是将F#模块暴露给C#调用者的更好方法.
以下是一个示例包装器:
type TimeSeriesDataProcessor(fileName:string) =
let mutable _fileName = fileName
let _rawInputData = loadCsvFile _fileName
let _pivotedData = _rawInputData
|> pivotRawData
|> fillPivotedRawData
|> calculateExpandingZscore
//read and write
member this.FileName
with get () = _fileName
and set (value) = _fileName <- value
member this.RawInputData
with get () = _rawInputData
member this.PivotedData
with get () = _pivotedData
member this.rawInputDataCount
with get () = _rawInputData.RowCount
member this.pivotedDataCount
with get () …Run Code Online (Sandbox Code Playgroud) 我正在学习F#和FSharp.Data库.我有一个任务,我需要阅读20个CSV文件.每个文件具有不同的列数,但记录具有相同的性质:键入日期字符串,其余所有列都是浮点数.在将结果保存到数据库之前,我需要对float格式数据列进行一些统计计算.虽然我得到了所有的管道逻辑工作:
解决方案远非可接受.我以为我可以创建一个通用的顶级函数作为循环遍历所有文件的驱动程序.然而,经过几天的尝试,我无处可去.
FSharp.Data CSV类型提供程序具有以下模式:
type Stocks = CsvProvider<"../docs/MSFT.csv">
let msft = Stocks.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")
msft.Data |> Seq.map(fun row -> do something with row)
...
Run Code Online (Sandbox Code Playgroud)
我试过了:
let mainfunc (typefile:string) (datafile:string) =
let msft = CsvProvider<typefile>.Load(datafile)
....
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为CsvProvider抱怨typefile不是有效的常量表达式.我猜测类型提供者必须要求文件在编码时推断出列的类型,在使用相关信息调用mainfunc的代码之前,不能推迟类型推断.
然后我尝试将Type作为参数传递给mainfunc
也不
let mainfunc (typeProvider:CsvProvider<"../docs/MSFT.csv">) =
....
Run Code Online (Sandbox Code Playgroud)
也不
let mainfunc<typeProvider:CsvProvider<"../docs/MSFT.csv">> =
....
Run Code Online (Sandbox Code Playgroud)
工作.
然后我试图通过MSFT
type Stocks = CsvProvider<"../docs/MSFT.csv">
let msft = Stocks.Load("http://ichart.finance.yahoo.com/table.csv?s=MSFT")
Run Code Online (Sandbox Code Playgroud)
进入mainFunc.根据intellisence,MSFT有一种类型CsvProvider<...>和MSFT.Data类型seq<CsvProvider<...>>.我试图用这两个显式类型声明一个输入参数,但它们都不能通过编译.
有谁可以请帮助并指出我正确的方向?我在这里错过了一些基本的东西吗?任何.net类型和类对象都可以在F#函数中用于显式指定参数类型,但是我可以对类型提供程序中的类型执行相同的操作吗?
如果上述问题的答案是否定的,那么使逻辑通用处理20个文件甚至200个不同文件的替代方法是什么?
在VS2015中添加interop.office.Excel.dll的引用后,F#(4.0,.net 4.6.1)仍然无法识别Excel.dll下的类型。
对 Excel.dll 的引用看起来像
作为比较,我创建了一个具有相同参考的 C# 项目,找到参考没有问题。
奇怪的是,如果引用 excel dll 下的工作簿对象,F# 代码确实可以编译。(我只需要将它视为动态类型)只有智能感知不起作用。
有什么建议吗?谢谢
我有以下虚拟代码来测试F#中的TPL.(Mono 4.5,Xamarin工作室,四核MacBook Pro)
令我惊讶的是,所有进程都在同一个线程上完成.根本就没有并行性.
open System
open System.Threading
open System.Threading.Tasks
let doWork (num:int) (taskId:int) : unit =
for i in 1 .. num do
Thread.Sleep(10)
for j in 1 .. 1000 do
()
Console.WriteLine(String.Format("Task {0} loop: {1}, thread id {2}", taskId, i, Thread.CurrentThread.ManagedThreadId))
[<EntryPoint>]
let main argv =
let t2 = Task.Factory.StartNew(fun() -> doWork 10 2)
//printfn "launched t2"
Console.WriteLine("launched t2")
let t1 = Task.Factory.StartNew(fun() -> doWork 8 1)
Console.WriteLine("launched t1")
let t3 = Task.Factory.StartNew(fun() -> doWork 10 3)
Console.WriteLine("launched …Run Code Online (Sandbox Code Playgroud) 嗨,这是C#语言如何处理Com互操作资源管理的例子.原始来源:
Excel.Application app = null;
Excel.Workbooks books = null;
Excel.Workbook book = null;
Excel.Sheets sheets = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
try
{
app = new Excel.Application();
books = app.Workbooks;
book = books.Add();
sheets = book.Sheets;
sheet = sheets.Add();
range = sheet.Range["A1"];
range.Value = "Lorem Ipsum";
book.SaveAs(@"C:\Temp\ExcelBook" + DateTime.Now.Millisecond + ".xlsx");
book.Close();
app.Quit();
}
finally
{
if (range != null) Marshal.ReleaseComObject(range);
if (sheet != null) Marshal.ReleaseComObject(sheet);
if (sheets != null) Marshal.ReleaseComObject(sheets);
if (book != …Run Code Online (Sandbox Code Playgroud) 在我询问如何在下划线数据从此处提出的本地 js var 问题刷新后重新应用工具栏过滤器时,Oleg 为我提供了一个解决方案:1 使用 datatype:"local" 和 data:localvar 的组合。
现在我面临着一个不同的问题,一周后我无法解决。
根据 Jqgrid wiki,当使用本地数据源时,默认的 localreader 看起来像
The initial configuration of the localReader is the same as those from jsonReader
localReader = {
root: "rows",
page: "page",
total: "total",
records: "records",
repeatitems: false,
cell: "cell",
id: "id",
userdata: "userdata",
subgrid: {root:"rows", repeatitems: true, cell:"cell"}
}
Run Code Online (Sandbox Code Playgroud)
我发现事实并非如此。因为在我可以找到的使用 dataype:"local" 的每个示例中,它总是使用直接的 js 数组而不是 js 对象,如下所示:
var mydata = [
{id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}];
Run Code Online (Sandbox Code Playgroud)
我尝试使用默认的 localReader (将重复项设置为 true)来处理
var locObj = {"rows":[
{"id":0,"cell":["val1","val2","val3"]},
{"id":1,"cell":["val1","val2","val3"]}
], …Run Code Online (Sandbox Code Playgroud) 由于复制/粘贴,我在自己的代码中发现了一个错误.相同的值名称由同一范围内的复制/粘贴进行遮蔽.
let func() =
let a = 1
let a = something_else
....
Run Code Online (Sandbox Code Playgroud)
在C#中我不会通过编译.有没有办法禁用阴影?至少在相同的范围内?
谢谢