gpt4 book ai didi

f# - 如何在 fsharp 的对象表达式中使用 `member val`?

转载 作者:行者123 更新时间:2023-12-01 14:08:50 27 4
gpt4 key购买 nike

我在 F# 中有一个接口(interface)(从一些 typescript 生成),看起来像这样:

type [<AllowNullLiteral>] AppOptions =
abstract credential: Admin.Credential.Credential option with get, set
abstract databaseAuthVariableOverride: Object option with get, set
abstract databaseURL: string option with get, set
abstract storageBucket: string option with get, set
abstract projectId: string option with get, set

我认为创建该类型实例的最简单方法是创建一个简单的对象表达式,但我无法让它工作。对象表达式中不允许使用 member val 吗?如果没有,创建一个简单的接口(interface)实例的最简单方法是什么,所有属性都有 getter 和 setter?这是我尝试过但没有用的方法:

let options = 
{ new Admin.AppOptions with
member val credential: Admin.Credential.Credential option = None with get, set
member val databaseAuthVariableOverride: obj option = None with get, set
member val databaseURL: string option = None with get, set
member val databaseURL: string option = None with get, set
member val projectId: string option = None with get, set
}

最佳答案

我认为成员 var 不在对象表达式规范中,只允许像这样的长格式属性:

let options =
let mutable credential = None
let mutable databaseAuthVariableOverride = None
let mutable databaseURL = None
let mutable storageBucket = None
let mutable projectId = None
{ new AppOptions with
member x.credential with get() = credential and set v = credential <- v
member x.databaseAuthVariableOverride with get() = databaseAuthVariableOverride and set v = databaseAuthVariableOverride <- v
member x.databaseURL with get() = databaseURL and set v = databaseURL <- v
member x.storageBucket with get() = storageBucket and set v = storageBucket <- v
member x.projectId with get() = projectId and set v = projectId <- v
}

编译器会像这样投影 C# 代码:

[assembly: FSharpInterfaceDataVersion(2, 0, 0)]
[assembly: AssemblyVersion("0.0.0.0")]
[CompilationMapping(SourceConstructFlags.Module)]
public static class _
{
[Serializable]
[AllowNullLiteral]
[CompilationMapping(SourceConstructFlags.ObjectType)]
public interface AppOptions
{
override FSharpOption<object> credential
{
get;
set;
}

override FSharpOption<object> databaseAuthVariableOverride
{
get;
set;
}

override FSharpOption<string> databaseURL
{
get;
set;
}

override FSharpOption<string> storageBucket
{
get;
set;
}

override FSharpOption<string> projectId
{
get;
set;
}
}

See sharplab

普通类型在这里可能更简洁:

    type t() = 
interface AppOptions with
member val credential = None with get, set
member val databaseAuthVariableOverride = None with get, set
member val databaseURL = None with get, set
member val storageBucket = None with get, set
member val projectId = None with get, set

关于f# - 如何在 fsharp 的对象表达式中使用 `member val`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51721591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com