如何在F#中实例化类及其属性

4

请遵循C#代码:

var body = new CustomerRequest
{
    Method = "CREDIT_CARD",
    CreditCard = new Creditcard
    {
        ExpirationMonth = "06",
        ExpirationYear = "2022",
        Number = "4012001037141112",
        Cvc = "123"
    }
};

我刚开始学习F#,发现不能像C#一样实例化类。以下是F#的代码:

let body = CustomerRequest
(
    Method = "CREDIT_CARD"     // Help here
)

我无法将C#转换为F#。

3个回答

3
如果您正在使用惯用的 F#,则应该使用 记录 来建模,而不是使用
您可以像这样实现:
type CreditCard = {
    ExpirationMonth: int;
    //More
}

type CustomerRequest = {
    Method: string;
    CreditCard: CreditCard;
}

let req = {
    Method = "Credit"
    CreditCard = {
        ExpirationMonth = 6
        //More
    }
}

编译器具有类型推断功能,这意味着它可以通过字段猜测req是一个CustomerRequest,并且同样适用于CreditCard - 如果您确实需要,您可以提示类型。
如果您真的需要类 - 也许您必须与C#代码交互,那么您应该这样做:
type CreditCard2(expirationMonth:int) = 
    member this.ExpirationMonth = expirationMonth

type CustomerRequest2(method: string, creditCard: CreditCard2) = 
    member this.Method = method
    member this.CreditCard = creditCard

let req2 = CustomerRequest2 ("Credit", CreditCard2 (5))

谢谢你的帮助。 - Matheus Miranda

2
我认为这就是你要寻找的内容:

CreditCard.fs

将"Original Answer"翻译成“最初的回答”
namespace StackOverflow

type CreditCard() =
    member val ExpirationDate = "" with get, set
    member val ExpirationYear = "" with get, set
    member val Number = "" with get, set
    member val Cvc = "" with get, set

type CustomerRequest() =
    member val Method = "" with get, set
    member val CreditCard = new CreditCard() with get, set

Program.fs

open System
open StackOverflow

[<EntryPoint>]
let main argv =
    let body = new CustomerRequest(Method = "CREDIT_CARD",
                                        CreditCard = CreditCard(
                                            ExpirationDate = "06",
                                            ExpirationYear = "2022",
                                            Number = "4012001037141112",
                                            Cvc = "123"
                                        ))
    0

我对F#并不是很了解,所以或许像David Shaw那样使用Records更好。但基本上,这将使您在类型中无需使用参数构造函数和非属性可变值的情况下完成它。"最初的回答"

谢谢你的帮助。 - Matheus Miranda
看着你的代码:CreditCard = new CreditCard,需要使用 new 命令吗? - Matheus Miranda
@MatheusMiranda 看起来你没有。我会编辑答案。 - izzy255

2
如果你只想使用命名参数来设置你正在构造的类的属性:语法与C#非常相似。至于缩进级别,你需要与第一个参数对齐。
let body =
    CustomerRequest(
        Method = "CREDIT_CARD",
        CreditCard =
            Creditcard(
                ExpirationMonth = "06",
                ExpirationYear = "2022",
                Number = "4012001037141112",
                Cvc = "123" ) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接