对访问元组列表中的数据感到困惑 F#
Confused on accessing data in a list of tuples F#
//Return a tuple from a text file:
let ExtractFromLine (line:string) =
let strings = line.Split('\t') //data members are spaced by tab
let strlist = Array.toList(strings) //each data member is now a list of str
let year = System.Int32.Parse(strlist.Head) //year is first in file, so Head
let values = List.map System.Double.Parse strlist.Tail //tail are all values
let average = List.average values //not part of text file
let min = List.min values //not part of text file
let max = List.max values //not part of text file
(year, values, average, min, max) //return tuple with all info
//----------
let rec createList fileline =
if fileline = [] then
[]
else
let (year, values, average, min, max) = ExtractFromLine fileline.Head
let l = (year, values, average, min, max) :: createList fileline.Tail
l
//------------
let main argv =
let file = ReadFile "data.txt"
let biglist = createList file //recursive function to make a list of tuples
printfn"%A" biglist //This prints the year, all values, average, min, and max for each tuple created
我现在有一个巨大的元组列表,其中包含我需要的所有信息。
我是否保留了访问内部所有元素并对它们执行计算的可能性?我用 C++ 编程,解决方案在该语言中是可行的,但我认为 F# 更强大.我确定这是可能的,我只是缺少基础知识。
例如,如何打印所有年份的所有值的平均值?
我在想一个 for 循环,但我不确定如何迭代。
for(all tuples in biglist)
printfn"%A:%A" tuple.year tuple.average
这显然是错误的,但我想你们明白我在做什么。
上述问题涉及一次从列表中的一个元组中提取数据。 如果我想打印最大的平均值怎么办?这将涉及访问每个元组的平均数据成员并将它们与 return 最大的数据成员进行比较。我是否必须创建另一个包含这些平均值的列表?
我了解了 fst 和 snd,但我很难将其应用到这个示例中。
如果问题太多,您不必回答所有问题,但在我开始使用这种语言时,非常感谢您的帮助,谢谢
在手机上,请原谅我没有做任何代码示例:)
我怀疑你丢失的那块拼图叫做模式匹配。在 F# 中,您可以像这样处理元组的元素:
let (y, v, Av, mn, mx) = mytuple
请注意,您也可以在函数声明中以及执行 'match' 时使用它。
('twoples' 有一个例外,您可以在其中使用函数 'fst' 和 'snd')
您应该使用的另一件事是 |> 运算符。
您可以在 F# 中循环,但它是来自命令式编程世界的构造。更惯用的方法是递归访问列表的项目。
下面是一些创建元组的示例代码,构造一个列表,然后访问项目并检查哪个更大。查看您的代码,平均值是元组中的第三项。这就是我添加 trd
函数的原因。它需要一个 5 项元组和 returns 第三项。
prcsLst
函数有两个参数:一个列表和一个起始最大值。这个想法是,在处理列表时,我们取头部(列表中的第一项),将其平均值与当前最大值进行比较。较大者与列表的尾部(没有第一项的列表)一起传递到下一轮递归。在这种情况下,作为初始最大值,我传入了第一项的平均值。
您可以运行 F# Interactive 中的示例来查看结果。
// create sample tuples
let t1 = (2014, 35, 18, 5, 45)
let t2 = (2014, 32, 28, 8, 75)
let t3 = (2014, 25, 11, 9, 55)
let t4 = (2015, 16, 13, 2, 15)
let t5 = (2015, 29, 15, 1, 35)
// create sample list
let lst = [t1;t2;t3;t4;t5]
// a function to return third item in a tuple
let trd (_,_,t,_,_) = t
// process list recursively
let rec prcsLst l max =
match l with
| [] -> max
| hd::tl ->
if (trd hd) > max then
prcsLst tl (trd hd)
else
prcsLst tl max
// invoke the method on the sample list
// as a starting point use the first item in the list
prcsLst lst (trd t1);;
//Return a tuple from a text file:
let ExtractFromLine (line:string) =
let strings = line.Split('\t') //data members are spaced by tab
let strlist = Array.toList(strings) //each data member is now a list of str
let year = System.Int32.Parse(strlist.Head) //year is first in file, so Head
let values = List.map System.Double.Parse strlist.Tail //tail are all values
let average = List.average values //not part of text file
let min = List.min values //not part of text file
let max = List.max values //not part of text file
(year, values, average, min, max) //return tuple with all info
//----------
let rec createList fileline =
if fileline = [] then
[]
else
let (year, values, average, min, max) = ExtractFromLine fileline.Head
let l = (year, values, average, min, max) :: createList fileline.Tail
l
//------------
let main argv =
let file = ReadFile "data.txt"
let biglist = createList file //recursive function to make a list of tuples
printfn"%A" biglist //This prints the year, all values, average, min, and max for each tuple created
我现在有一个巨大的元组列表,其中包含我需要的所有信息。 我是否保留了访问内部所有元素并对它们执行计算的可能性?我用 C++ 编程,解决方案在该语言中是可行的,但我认为 F# 更强大.我确定这是可能的,我只是缺少基础知识。
例如,如何打印所有年份的所有值的平均值? 我在想一个 for 循环,但我不确定如何迭代。
for(all tuples in biglist)
printfn"%A:%A" tuple.year tuple.average
这显然是错误的,但我想你们明白我在做什么。
上述问题涉及一次从列表中的一个元组中提取数据。 如果我想打印最大的平均值怎么办?这将涉及访问每个元组的平均数据成员并将它们与 return 最大的数据成员进行比较。我是否必须创建另一个包含这些平均值的列表?
我了解了 fst 和 snd,但我很难将其应用到这个示例中。 如果问题太多,您不必回答所有问题,但在我开始使用这种语言时,非常感谢您的帮助,谢谢
在手机上,请原谅我没有做任何代码示例:)
我怀疑你丢失的那块拼图叫做模式匹配。在 F# 中,您可以像这样处理元组的元素:
let (y, v, Av, mn, mx) = mytuple
请注意,您也可以在函数声明中以及执行 'match' 时使用它。
('twoples' 有一个例外,您可以在其中使用函数 'fst' 和 'snd')
您应该使用的另一件事是 |> 运算符。
您可以在 F# 中循环,但它是来自命令式编程世界的构造。更惯用的方法是递归访问列表的项目。
下面是一些创建元组的示例代码,构造一个列表,然后访问项目并检查哪个更大。查看您的代码,平均值是元组中的第三项。这就是我添加 trd
函数的原因。它需要一个 5 项元组和 returns 第三项。
prcsLst
函数有两个参数:一个列表和一个起始最大值。这个想法是,在处理列表时,我们取头部(列表中的第一项),将其平均值与当前最大值进行比较。较大者与列表的尾部(没有第一项的列表)一起传递到下一轮递归。在这种情况下,作为初始最大值,我传入了第一项的平均值。
您可以运行 F# Interactive 中的示例来查看结果。
// create sample tuples
let t1 = (2014, 35, 18, 5, 45)
let t2 = (2014, 32, 28, 8, 75)
let t3 = (2014, 25, 11, 9, 55)
let t4 = (2015, 16, 13, 2, 15)
let t5 = (2015, 29, 15, 1, 35)
// create sample list
let lst = [t1;t2;t3;t4;t5]
// a function to return third item in a tuple
let trd (_,_,t,_,_) = t
// process list recursively
let rec prcsLst l max =
match l with
| [] -> max
| hd::tl ->
if (trd hd) > max then
prcsLst tl (trd hd)
else
prcsLst tl max
// invoke the method on the sample list
// as a starting point use the first item in the list
prcsLst lst (trd t1);;