小编pac*_*nda的帖子

F#功能耦合迭代:性能问题和首选功能样式

我正在阅读Tomas Petricek和Jon Skeet的优秀书籍"真实世界的功能编程"(两位SO大师,顺便说一遍,感谢他们两位).以下函数(第277页)介绍了一种计算阵列上三点平均值的方法,该方法将边值视为特殊值:

let blurArray (arr:float[]) = 
   let res = Array.create arr.Length 0.0
   res.[0] <- (arr.[0] + arr.[1]) / 2.0
   res.[arr.Length-1] <- (arr.[arr.Length - 2] + arr.[arr.Length -1 ] )/2.0
   for i in 1 .. arr.Length - 2 do
      res.[i] <- (arr.[i-1] + arr.[i] + arr.[i+1]) / 3.0
   res
Run Code Online (Sandbox Code Playgroud)

我理解该函数对于外部世界是不可变的,即使内部采用变异和赋值.而且,虽然它确实是必要的,但我可以编写并采用保留声明式的风格.不过,我试图提出一个功能性解决方案,作为练习以更熟悉更高阶函数等.我将报告我的解决方案,然后将表达我的问题.首先,我定义一个辅助函数

let computeElementsAverage (myArray:float[]) myIndex (myElement:float) =
   match myIndex with
   | 0 -> (myArray.[0..1] |> Array.average )
   | lastInd when lastInd = (myArray.Length -1 ) -> (myArray.[lastInd-1..lastInd] |> Array.average )
   | …
Run Code Online (Sandbox Code Playgroud)

.net f# functional-programming purely-functional data-structures

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

F# CSV TypeProvider 在控制台应用程序中不太健壮

我正在尝试使用来自冠状病毒大流行的实时数据(不幸的是,祝我们所有人好运)。

我开发了一个小脚本,我正在过渡到一个控制台应用程序:它使用 CSV 类型的提供程序。

我有以下问题。假设我们要按地区过滤意大利传播,我们可以将此代码用于 .fsx 文件:

open FSharp.Data

let provinceData = CsvProvider< @"https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-province/dpc-covid19-ita-province.csv" , IgnoreErrors = true>.GetSample()


let filterDataByProvince province = 
    provinceData.Rows
    |> Seq.filter (fun x -> x.Sigla_provincia = province)
Run Code Online (Sandbox Code Playgroud)

由于序列懒惰,然后假设我强制编译器将罗马省的数据加载到内存中,我可以添加:

let romeProvince = filterDataByProvince "RM" |> Seq.toArray
Run Code Online (Sandbox Code Playgroud)

这工作正常,由 FSI 在本地运行。

现在,如果我使用 .fs 文件将此代码转换为控制台应用程序;我声明了完全相同的函数并使用完全相同的类型提供程序加载器;但我没有使用最后一行来收集数据,而是将其放入主函数中:

[<EntryPoint>]
let main _ =
    let romeProvince = filterDataByProvince "RM" |> Seq.toArray

    Console.Read() |> ignore
    0
Run Code Online (Sandbox Code Playgroud)

这会导致以下运行时异常:

System.Exception
  HResult=0x80131500
  Message=totale_casi is missing
  Source=FSharp.Data
  StackTrace:
   at <StartupCode$FSharp-Data>.$TextRuntime.GetNonOptionalValue@139-4.Invoke(String message)
   at CoronaSchiatta.Evoluzione.provinceData@10.Invoke(Object parent, String[] row) in C:\Users\glddm\source\repos\CoronaSchiatta\CoronaSchiatta\CoronaEvolution.fs:line 10 …
Run Code Online (Sandbox Code Playgroud)

f# f#-interactive type-providers f#-data fsharp.data.typeproviders

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

F# 和 ILNumerics

我刚刚下载了 ILNumerics 的最新版本,可用于我的 F# 项目。是否可以在 F# 中利用这个库?我尝试过简单的计算,但看起来很麻烦(在 F# 中)。

我想设置一个有约束(甚至无约束)的优化问题。通常的 Rosenbrock 函数会做,然后我将使用我自己的函数。我什至很难定义一个数组。我可以定义的唯一类型的数组是 RetArray,例如使用此代码

let vector = ILMath.vector<float>(1.0, 2.0)
Run Code Online (Sandbox Code Playgroud)

编译器表示 vector 是一个 RetArray;我认为这是因为它是从函数返回的(即:ILMath.vector)。如果我定义另一个类似的向量,我可以 -eg- 求和向量,简单地写,例如

let a = ILMath.vector<float>(1.0, 2.0)
let b = ILMath.vector<float>(3.2,2.2)
let c = a  + b 
Run Code Online (Sandbox Code Playgroud)

我得到

RetArray<float> = seq [4.2; 4.2]
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试检索 c 的值,再次写入,例如在 FSI 中,

c;;
Run Code Online (Sandbox Code Playgroud)

我得到

错误:未将对象引用设置为对象的实例。

在 F# 中使用 ILNumerics 的建议方法是什么?是否可以在 F# 中本地使用该库,或者我被迫从 C# 库调用我的 F# 代码以使用整个 ILNumerics 库?除了引用的问题之外,当我在 F# 中移植时,我在理解 ILNumerics 的基本逻辑方面存在问题。

例如,示例代码中使用作用域的 C# 的 F# 等效项是什么,如下所示:

using (ILScope.Enter(inData)) { ...

}
Run Code Online (Sandbox Code Playgroud)

optimization f# numerical-analysis ilnumerics

2
推荐指数
1
解决办法
77
查看次数