小编cas*_*bby的帖子

设计一个由C#调用的F#模块(Console/MVC/WPF)

我一直在尝试使用Deedle F#Library编写一个F#批处理程序.它运作得很好.但是,我不确定以下两项任务的最佳设计:

  1. 将F#模块组合到现有的ASP.net MVC/Web Api系统中

  2. 创建一个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)

c# wpf f# deedle

13
推荐指数
1
解决办法
613
查看次数

可以将类型提供程序作为参数传递给函数

我正在学习F#和FSharp.Data库.我有一个任务,我需要阅读20个CSV文件.每个文件具有不同的列数,但记录具有相同的性质:键入日期字符串,其余所有列都是浮点数.在将结果保存到数据库之前,我需要对float格式数据列进行一些统计计算.虽然我得到了所有的管道逻辑工作:

  • 通过FSharp.Data CSV类型提供程序读取CSV,
  • 使用反射来获取每个列字段的类型以及它们被送入模式匹配的标题名称,这决定了相关的计算逻辑
  • sqlbulkcopy结果),我结束了20个函数(每个CSV文件1个).

解决方案远非可接受.我以为我可以创建一个通用的顶级函数作为循环遍历所有文件的驱动程序.然而,经过几天的尝试,我无处可去.

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个不同文件的替代方法是什么?

f# type-providers f#-data

7
推荐指数
1
解决办法
1429
查看次数

F# 无法识别 interop.office.Excel.dll

在VS2015中添加interop.office.Excel.dll的引用后,F#(4.0,.net 4.6.1)仍然无法识别Excel.dll下的类型。

在此处输入图片说明

对 Excel.dll 的引用看起来像

在此处输入图片说明

作为比较,我创建了一个具有相同参考的 C# 项目,找到参考没有问题。

奇怪的是,如果引用 excel dll 下的工作簿对象,F# 代码确实可以编译。(我只需要将它视为动态类型)只有智能感知不起作用。

有什么建议吗?谢谢

.net excel f# office-interop excel-interop

5
推荐指数
1
解决办法
528
查看次数

Mono下的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)

mono f# asynchronous task-parallel-library

4
推荐指数
2
解决办法
288
查看次数

在F#中处理资源清理的功能方式

嗨,这是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)

c# com f# functional-programming excel-interop

4
推荐指数
1
解决办法
132
查看次数

Jqgrid 数据类型从数组本地加载

在我询问如何在下划线数据从此处提出的本地 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)

jqgrid

3
推荐指数
1
解决办法
9451
查看次数

F#值阴影 - 是否可以在同一范围内禁用值阴影

由于复制/粘贴,我在自己的代码中发现了一个错误.相同的值名称由同一范围内的复制/粘贴进行遮蔽.

let func() =
    let a = 1
    let a = something_else
    ....
Run Code Online (Sandbox Code Playgroud)

在C#中我不会通过编译.有没有办法禁用阴影?至少在相同的范围内?

谢谢

f# shadowing

3
推荐指数
1
解决办法
306
查看次数