FSharp函数/方法主体作为脚本执行,但在运行时不作为源文件执行

时间:2018-07-14 17:09:49

标签: c# methods module f# interop

感谢您度过这个漫长的Q期,非常感谢您的帮助。 因此,情况是我在模块中嵌套了一部分FSharp代码,并且模块嵌套在其中,还有CSharp代码从这些嵌套模块之一的公共类型中调用方法。请参见下面的代码: Array.Parallel.map     命名空间MachineLearning.Predictions

// refrences to other namespaces/modules

module Sample = 
    // so this is set at compile
    let cons1 = MachinLearning.Example.Calc.comp(something)     

module MulRegression =  
    // this too is set at compile
    let cons2 = MachinLearning.Example.Calc.comp(something)
    // other code 

    type public OPrediction() =    
        // this runs ok and gets the resulting value 
        let valu0 = 
            MachinLearning.Example.Calc.comp(something)

        let valu1 = cons2    // debugger jumps out as if no cons2 exist

        member this.OPred(atp) = 
           // a bunch of values, functions, etc, from other modules

module LogRegression =  
    // other code

    type public CPrediction() =        
       member this.CPred(atp) = 
           // a bunch of values, functions, etc, from other modules

首先,必需的名称空间由using NamespacePath;“模块打开,” using static ModulePath;”模块打开,整个解决方案的构建没有任何问题。FSharp代码本身在FSharp环境中生成所需的结果( FSI,从另一个FSharp代码进行调用。)现在,问题出在模块{{1}中的方法prediction.CPred(inp)和模块MachineLearning.Predictions.LogRegression中的方法OPrediction.OPred(inp)的CSharp代码调用中。作为方法的返回值的已知值(例如MachineLearning.Predictions.MulRegressioninpinp + 7),一切都很好。第一行带有方法范围之外的值(例如2),执行就简单地跳了出来。没有错误,什么也没有,它没有返回值就跳出来了!

let len = pidz.Length

更新1 :经过...的一天:对我来说,它变得更加奇怪了。在类型//------------------------------------------------------------ // FSharp test script runs perfectly and produces the results. //------------------------------------------------------------ // #load directives module Test1 = // open statements let op = OPrediction() let res = op.OPred(717) do printfn "%A" res module Test2 = // open statements let cp = CPrediction() let res = cp.CPred(800.) do printfn "%A" res //------------------------------------------------------------ // CSharp calling method does not return anything. //------------------------------------------------------------ // GET: ODetails/OPredict/1 public Int32 OPredict(int id) { var op = new OPrediction(); // so far, A-OK! // 1) OPred(id) is defined like OPred(id) = 2. then result is produced. // 2) OPred keeps its def, then when 'stepping-in', the first line // involving other than 'id' or constant, debugger jumps out to // get the next item in queue and the story repeats. var res = (Int32)op.OPred(id); return res; } // GET: CDetails/CPredict/1 public Int32 CPredict(double point) { var cp = new CPrediction(); var res = (Int32)cp.CPred(point); return res; } 的范围内,好像调试器无法识别使用顶部命名空间OPrediction中其他命名空间/模块中的东西定义的任何值和标识符,也不包括任何嵌套模块,包括包含类型本身的模块。另一方面,调试器似乎可以通过直接调用类型主体内的所述函数来识别设置的值。

更新2 :在通过FSI逐项检查了整个可恶的东西之后:

  1. 问题出在运行时。无论是从Program.fs还是CSharp调用该方法,问题仍然存在。在将代码作为脚本运行时,我没有遇到问题。
  2. 问题特别是涉及bluemountaincapital MachineLearning.Predictions数据帧并转换为Deedle,涉及表达式float
  3. 我不确定问题出在并行访问数据帧的行还是将数据帧的列转换为Array.Parallel.map。为了安全起见,我通过将数据帧的每一列显式转换为float并将结果重构为一个新帧,并采用更长且不太优雅的非并行路径来解决这两个问题,现在代码运行时没有顺利-到目前为止。

1 个答案:

答案 0 :(得分:1)

1)问题特别是涉及bluemountaincapital RewriteEngine On RewriteCond %{SERVER_PORT} !=443 [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.medconnect.pl/$1 [R=301,L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] 数据帧并转换为Deedle,涉及表达式float

2)我不确定是并行访问数据帧的行还是将数据帧的列转换为Array.Parallel.map。为了安全起见,我通过将数据帧的每一列显式转换为float并将结果重构为一个新帧,并采用更长且不太优雅的非并行路径来解决这两个问题,现在代码运行时没有顺利-到目前为止。

3)我不确定明确转换每列并重建框架的过程是否是个好主意。对于非常大的数据帧,可能会出现问题,然后可能再也不会... !!!