gpt4 book ai didi

arrays - F# 中两个数组的匹配元素

转载 作者:行者123 更新时间:2023-12-02 09:53:46 25 4
gpt4 key购买 nike

我有两个股票数据序列,我正在尝试排列日期并组合数据,以便我可以将其传递给其他函数来运行一些统计数据。本质上,我想传递两个(或更多)看起来像这样的序列:

sequenceA = [(float,DateTime)]
sequenceB = [(float,DateTime)]

到一个函数,并让它返回一个序列,其中所有数据都按日期时间正确对齐。像这样的东西:

return = [(float,float,DateTime)]

其中 float 是该日期时间的两个序列的收盘价。

我尝试过使用嵌套的 for 循环,并且我相当确定它应该可以工作(尽管我在使用它时遇到了一些问题),但似乎 F# 的匹配表达式也应该能够处理这个问题。我查阅了一些匹配表达式的文档和示例,但遇到了许多无法解决的不同问题。

这是我最近尝试实现的目标的简化版本。正如您所看到的,我只是想看看序列“x”的第一个元素是否具有日期“1/11/2011”。问题是 1) 它总是返回“Yes”,2) 我不知道如何从这里到达整个序列,然后最终到达 2 个以上的序列。

let x = seq[(1.0,System.DateTime.Parse("1/8/2011"));(2.0,System.DateTime.Parse("1/9/2011"))]
type t = seq<float*DateTime>

let align (a:t) =
let testDate = System.DateTime.Parse("1/11/2011")
let b = Seq.head(a)
match snd b with
| testDate -> printfn "Yes"
| _ -> printfn "No"

align x

我对 F# 比较陌生,但我相当确定这应该可以通过匹配表达式实现。任何帮助将不胜感激!

最佳答案

您的问题分为两部分:

对于模式匹配,在上面的模式中,testDate 是将绑定(bind)到元组 b 中的第二项的名称。两种模式都将匹配任何日期,但由于第一个模式匹配,因此您的示例始终打印“yes”。

如果您想匹配特定的日期值,您可以在模式中使用“when”关键字:

let dateValue = DateTime.Today

match dateValue with
| someDate when someDate = DateTime.Today -> "Today"
| _ -> "Not Today"

如果我必须实现对齐功能,我可能不会尝试使用模式匹配。您可以使用 Seq.groupBy 收集具有相同日期的所有条目。

///Groups two sequences together by key
let align a b =

let simplifyEntry (key, values) =
let prices = [for value in values -> snd value]
key, prices

a
|> Seq.append b
|> Seq.groupBy fst
|> Seq.map simplifyEntry
|> Seq.toList

//Demonstrate alignment of two sequences
let s1 = [DateTime.Today, 1.0]
let s2 = [
DateTime.Today, 2.0
DateTime.Today.AddDays(2.0), 10.0]

let pricesByDate = align s1 s2

for day, prices in pricesByDate do
let pricesText =
prices
|> Seq.map string
|> String.concat ", "
printfn "%A %s" day pricesText

关于arrays - F# 中两个数组的匹配元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662737/

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