Как создать классы и их свойства в F # - PullRequest
0 голосов
/ 20 января 2019

Следуйте код 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 ]

0 голосов
/ 20 января 2019

Я думаю, это то, что вы ищете:

CreditCard.fs

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 #, так что, возможно, использование Records, как использует Дэвид Шоу, лучше для дизайна. Но в основном это позволит вам сделать это без конструктора параметров и без изменяемого значения не свойства в вашем типе.

0 голосов
/ 20 января 2019

Если вы просто хотите использовать именованные аргументы для установки свойств создаваемых вами классов: синтаксис очень похож на C #. Что касается уровня отступа, вам нужно выровнять его с первым аргументом.

let body =
    CustomerRequest(
        Method = "CREDIT_CARD",
        CreditCard =
            Creditcard(
                ExpirationMonth = "06",
                ExpirationYear = "2022",
                Number = "4012001037141112",
                Cvc = "123" ) )
0 голосов
/ 20 января 2019

Если вы делаете идиоматический F #, вы бы смоделировали это с Records вместо классов .

Вы можете сделать это так:

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))
...