【问题标题】:Create a list of custom type in F# and create two sequences of that list在 F# 中创建自定义类型列表并创建该列表的两个序列
【发布时间】:2020-08-05 15:52:54
【问题描述】:

我在 F# 中创建了自己的类型,称为 Accounts,然后为每个帐户创建了对象。

type Account() =   

  let AccountNumber = ""
  let mutable Balance:float = 0.0

每个帐户都有两个字段,AccountNumber(字符串)和 Balance(浮点数)。

然后,我为每个包含 AccountName 和 Balance 的帐户创建了一个对象。

let acc1 = new Account()  
acc1.Insert("John",10.0)

let acc2 = new Account()  
acc2.Insert("Mike",50.0)

如何创建一个包含每个帐户(对象)的列表?我尝试了以下方法:

let AccountList : Account list = [acc1;  acc2 ;  acc3; acc4 ; acc5; acc6]
let AccountList : Account obj list = [acc1;  acc2 ;  acc3; acc4 ; acc5; acc6]

我无法使用上述方法解决问题,因为我必须从列表中创建两个序列:

序列1:余额大于等于0且小于50的所有账户 序列2:所有余额在50以上的账户

如何在 F# 中创建我的自定义类型的列表以及如何创建该列表的两个序列?

【问题讨论】:

    标签: arrays list functional-programming f# f#-interactive


    【解决方案1】:

    目前尚不清楚您到底在为什么而苦苦挣扎。但是,以下简单示例应该说明您可能需要使用的大多数关键思想。首先,这是您的 Account 类的一个小版本(请注意,我通常会使用不可变记录,但我按照您的方式保留了它):

    type Account(balance:float) =   
      let mutable balance = balance
      member x.Balance = balance
      member x.Add(difference) = 
        balance <- balance + difference
    

    我看不出您在创建列表时遇到了什么问题。以下工作正常:

    let acc1 = Account(100.0)
    let acc2 = Account(10.0)
    
    let accountList = [acc1; acc2]
    

    现在,要回答有关查找余额超过 50 的帐户的问题,您可以使用 List.filter 函数创建一个新的过滤列表:

    let above50 = 
      accountList |> List.filter (fun acc ->
        acc.Balance > 50.0)
    

    EDIT如果您想使用记录,那么您可以将类型定义为:

    type Account = { Balance : float }
    

    并使用以下方法创建一个值:

    let acc1 = { Balance = 100.0 }
    

    【讨论】:

    • 两个不同的新帐户是否只是在 f# 标签中发布了相同的问题,还是我看到了什么?
    • 亲爱的 Tomas,非常感谢您抽出宝贵时间回答这个问题。我可以请您告诉我您将如何使用不可变记录吗?我指示创建一个类型,该类型使用一个用于帐号的字符串字段和一个用于余额的浮动字段来保存帐户。然后我需要该类型中的成员函数来存款和取款。
    • @Asti 似乎是这样...我评论了另一个。
    • @DevonBurriss 我关闭了另一个作为重复项。另一个的措辞也几乎相同。
    【解决方案2】:

    所以我为另一个创建了这个答案,但我正在等待评论,看看我是否会回答。还有这方面的家庭作业:)

    因此,如果您有存储帐户的标准并希望一次性完成,您可能需要查看groupBy。这里我使用boolean,因为只有两种可能性,但数字或有区别的联合是很好的候选者。

    open System
    
    type Account(accountNumber:string, startingBalance:Int64) =
        let mutable balance = startingBalance
    
        member _.Balance = balance
        member _.Deposit amount = balance <- balance + amount
        member _.Withdraw amount = balance <- balance - amount
        override _.ToString() = accountNumber
    
    let allAccounts = [Account("ABC1", 10L); Account("ABC2", 50L)]
    
    let grouped = allAccounts |> List.groupBy (fun a -> a.Balance >= 50L) |> Map.ofList
    
    let under50 = grouped |> Map.tryFind false |> Option.defaultValue []
    let overIncl50 = grouped |> Map.tryFind true |> Option.defaultValue []
    
    printfn "Under: %A" under50
    printfn "Over: %A" overIncl50
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多