Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 我可以将类型作为参数传递给此函数吗?_Types_F#_Polymorphism_Parametric Polymorphism_Static Polymorphism - Fatal编程技术网

Types 我可以将类型作为参数传递给此函数吗?

Types 我可以将类型作为参数传递给此函数吗?,types,f#,polymorphism,parametric-polymorphism,static-polymorphism,Types,F#,Polymorphism,Parametric Polymorphism,Static Polymorphism,下面的代码,大部分是从 很好 module SVMModule open Accord.MachineLearning open Accord.MachineLearning.VectorMachines open Accord.MachineLearning.VectorMachines.Learning open Accord.Statistics.Kernels open Accord.Math.Optimization.Losses // open MathNet.Numerics

下面的代码,大部分是从

很好

module SVMModule

open Accord.MachineLearning
open Accord.MachineLearning.VectorMachines
open Accord.MachineLearning.VectorMachines.Learning
open Accord.Statistics.Kernels
open Accord.Math.Optimization.Losses

// open MathNet.Numerics.LinearAlgebra.Matrix

let inputs = [| [| 0.; 0. |]; [| 0.; 1. |]; [| 1.; 0. |]; [| 1.; 1. |] |]
let xor = [| 0; 1; 1; 0 |]
/// Creates and trains a Support Vector Machine given inputs and outputs.
/// The kernel can be Linear, Gaussian, or Polynomial.
/// The default tolerance is 1e-2.
let train (C: float) (tol: float) (inputs: float [] []) =
    let learn = SequentialMinimalOptimization<Gaussian>()

    learn.UseComplexityHeuristic <- true
    learn.UseKernelEstimation <- true
    if C >= 0. then learn.Complexity <- C
    if tol > 0. then learn.Tolerance <- tol

    let svm = learn.Learn(inputs, xor)
    svm

let svm = train 0.5 1e-2 inputs
let prediction = svm.Decide inputs

printfn "SVM_0 Prediction: %A" prediction
这不起作用,因为
if
表达式必须在其所有分支中返回相同类型的对象

我想知道是否有办法将
线性
高斯
作为一种类型传递到
列车
(这些确实是类型),这样我就不必为每种类型编写一个列车函数(
列车高斯
列车线性
)。Akso,即使我费劲地编写了这些单独的函数,我想根据用户的选择在运行时调用它们也会很困难,因为
if
语句也会遇到同样的问题

我使用接口在
F#
中实现了多态性,但是使用了我自己构建的类。这些类位于
Accord.NET
中,即使它们继承自基类,我也无法处理类型问题并实现多态性


感谢您的建议。

简单地用类型参数(如
't
)替换具体类型
Gaussian
(并且,可以选择将其作为显式类型参数添加到
train
)。在执行此操作时,我已稍微清理了您现有的代码:

let train<'t> (C: float) (tol: float) (inputs: float [] []) =
    let learn = SequentialMinimalOptimization<'t>(UseComplexityHeuristic = true, UseKernelEstimation = true)
    if C >= 0. then learn.Complexity <- C
    if tol > 0. then learn.Tolerance <- tol

    learn.Learn(inputs, xor)

简单地用类似于
't
的类型参数替换具体类型
Gaussian
(并且,可以选择将其作为显式类型参数添加到
train
)。在执行此操作时,我已稍微清理了您现有的代码:

let train<'t> (C: float) (tol: float) (inputs: float [] []) =
    let learn = SequentialMinimalOptimization<'t>(UseComplexityHeuristic = true, UseKernelEstimation = true)
    if C >= 0. then learn.Complexity <- C
    if tol > 0. then learn.Tolerance <- tol

    learn.Learn(inputs, xor)

谢谢这看起来很有希望。然而,当我把你的代码复制到我的.fsx文件中时,我在下面看到了一条红色的曲线SequentialMinimalOptimization@Soldalma-抱歉,我猜
SequentialMinimalOptimization
的类型参数上有一个约束,如果添加显式类型参数,则需要在定义中包含该约束(即,您需要将其定义为
train IKernel>
)。另一方面,如果您从定义中省略了参数(因此它只是
让train(C:float)…
)然后,我认为应该在您不做任何额外工作的情况下推断约束。再次感谢。两种选择都有效,尽管我很惊讶您可以从函数签名中删除类型并将其保留在函数体中。继续,我遇到了另一个障碍。如果类型是线性的,则语句
learn.UseKernelEstimation T这看起来很有希望。然而,当我把你的代码复制到我的.fsx文件中时,我在下面看到了一条红色的曲线SequentialMinimalOptimization@Soldalma-抱歉,我猜
SequentialMinimalOptimization
的类型参数上有一个约束,如果添加显式类型参数,则需要在定义中包含该约束(即,您需要将其定义为
train IKernel>
)。另一方面,如果您从定义中省略了参数(因此它只是
让train(C:float)…
)然后,我认为应该在您不做任何额外工作的情况下推断约束。再次感谢。两种选择都有效,尽管我很惊讶您可以从函数签名中删除类型并将其保留在函数体中。继续,我遇到了另一个障碍。如果类型是线性的,则语句
learn.UseKernelEstimation
let svm = train<Gaussian> 0.5 1e-2 inputs
let svm:Gaussian = train 0.5 1e-2 inputs