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
F# 如何将记录的属性声明为抽象函数_F# - Fatal编程技术网

F# 如何将记录的属性声明为抽象函数

F# 如何将记录的属性声明为抽象函数,f#,F#,我不熟悉F#和函数式编程,需要一些帮助。我来自c#,所以我的心态还是有点碍事 我需要将一些选项传递给一个函数,我正在为此使用一个记录。其中一个选项是延续功能单元->选项='a->'a选项 类型ProcessOptions={ func1:int->int选项 func2:func2//这项工作。。。 //func2:func2忽略 R 设f3(processOptions:processOptions)= processOptions.func1(3)|>忽略 processOptions.fu

我不熟悉F#和函数式编程,需要一些帮助。我来自c#,所以我的心态还是有点碍事

我需要将一些选项传递给一个函数,我正在为此使用一个记录。其中一个选项是延续功能单元->选项='a->'a选项 类型ProcessOptions={ func1:int->int选项 func2:func2//这项工作。。。 //func2:func2忽略 R 设f3(processOptions:processOptions)= processOptions.func1(3)|>忽略 processOptions.func2 789 |>忽略 () 设f4(processOptions:processOptions)= processOptions.func1(4)|>忽略 //processOptions.func2“abc”|>忽略//因此此操作不起作用。。。 () [] 让主argv= f1(1)|>忽略 f2 123 |>忽略 f2“abc”|>忽略 设fo={ func1=f1 func2=f2 } f3 fo 设fo1={ func1=f1 func2=f2 } f4 fo1 0
在这里,您需要将该记录设置为通用记录,例如

type ProcessOptions<'a> = {
        func1: int -> int option

        func2: Func2<'a>  // ... but this is what I'm trying to achieve - so that I can pass any Func2<'a> using this record.
    }

type ProcessOptions//…但这正是我试图实现的-这样我就可以传递任何Func2记录中的成员不能是泛型函数(可以使用不同类型的参数调用,例如
int
string
)。它总是有一个固定类型

您可以使用的技巧是使用泛型方法定义简单接口:

type Func = 
  abstract Invoke<'a> : 'a -> 'a option
创建
Func
值比编写普通函数要困难一些,但可以使用对象表达式:

let f1 =
  { new Func2 with
      member x.Invoke(a) = 
        let r = Some a
        printfn "f1: %A" r |> ignore
        r }
现在,您可以传递
ProcessOptions
并使用不同类型的参数调用
Invoke
方法:

let f4 (processOptions:ProcessOptions) = 
    processOptions.func1.Invoke 4 |> ignore
    processOptions.func2.Invoke "abc" |> ignore

f4 { func1 = f1; func2 = f1 }

谢谢Tomas。我喜欢你的解决方案,因为它可以方便地向记录中添加其他函数类型。John的解决方案也可以,但我想我必须向ProcessOptions中添加更多的泛型类型以获得其他泛型类型。
let f1 =
  { new Func2 with
      member x.Invoke(a) = 
        let r = Some a
        printfn "f1: %A" r |> ignore
        r }
let f4 (processOptions:ProcessOptions) = 
    processOptions.func1.Invoke 4 |> ignore
    processOptions.func2.Invoke "abc" |> ignore

f4 { func1 = f1; func2 = f1 }