我正在尝试向Seq模块添加一些额外的聚合函数.我在看这里列出的一些函数的实现:
https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs
其中一个免责声明是"该函数返回一个序列,一旦该序列被迭代,就会消化整个初始序列.因此,该函数不应该用于大序列或无限序列." 许多功能都是如此,例如GroupBy.
第一个问题:是否有方法可以编写可以有效处理大型序列的聚合函数?我知道"大"是主观的; 我只是在寻找编写这些函数的一般模式.
第二个问题:我如何确保像Dictionary这样的集合(在集合函数中定义)被有效地垃圾收集?我理解字典应该在超出范围时收集,但有没有办法明确表明?鉴于字典的范围是保留在函数内,我不能在那上面调用.Clear()吗?
我正在尝试解析XML文件的目录,然后在给定节点存在时选择特定属性的值.我无法理解以下F#导致的编译错误的原因.
open System
open System.IO
open System.Xml
open System.Xml.XPath
open System.Xml.Linq
let configRootDirectory = @"C:\dir"
let relativeProductDir = @"relDir"
let ExtractConfiguredCalculator (productConfigFile:string) =
let xmlNavigator = XPathDocument(productConfigFile).CreateNavigator()
let node = xmlNavigator.SelectSingleNode(@"Product/SupportedRisk/Risk[@type='PV']")
node.GetAttribute("methodology", "")
let configFile = Directory.GetFiles(Path.Combine(configRootDirectory, relativeProductDir), @"*.xml")
|> Seq.cast<string>
|> Seq.iter(fun configFileName -> ExtractConfiguredCalculator(configFileName))
|> Seq.filter(fun configuredCalculatorNode -> configuredCalculatorNode != null)
|> Seq.iter(fun calculator -> Console.WriteLine(calculator))
Run Code Online (Sandbox Code Playgroud)
上面的代码片段来自我在LinqPad中尝试的代码.看到的错误信息如下.
This expression was expected to have type unit but here has type string
Run Code Online (Sandbox Code Playgroud)
更新 尝试获得更多f#-ish.如果可以改进,请建议.
let configFile =
Directory.GetFiles(Path.Combine(configRootDirectory, relativeProductDir), @"*.xml") …Run Code Online (Sandbox Code Playgroud) 我有两个序列:
Seq("a" -> 1, "b" -> 2)
Seq("a" -> 3, "b" -> 4)
Run Code Online (Sandbox Code Playgroud)
我想要的是一个结果Map看起来像这样:
Map(a -> List(3, 1), b -> List(4, 2))
Run Code Online (Sandbox Code Playgroud) 对于我的项目,我想拉出seq的seq>.为此我想我可以使用GetEnumerator.之后我想比较头部(当前元素的Seq.head),如果它包含我选择的元素.问题是,如果我使用.Current它会给我回obj而不是seq.我做错了什么?
let convertElements (input:seq<seq<Elements>>) =
let en = input.GetEnumerator()
let rec loop (en:System.Collections.IEnumerator) =
match en.MoveNext() with
| true -> match (Seq.head en.Current) with
|AElement(_) -> createNewA andSoOn
|_ -> ()
| false -> ()
loop en
Run Code Online (Sandbox Code Playgroud) 假设我有一个数值向量
[1] 2844 4936 4936 4972 5078 6684 6689 7264 7264 7880 8133 9018 9968 9968 10247
[16] 11267 11508 11541 11607 11717 12349 12349 12364 12651 13025 13086 13257 13427 13427 13442
[31] 13442 13442 13442 14142 14341 14429 14429 14429 14538 14872 15002 15064 15163 15163 15324
[46] 15324 15361 15361 15400 15624 15648 15648 15648 15864 15864 15881 16332 16847 17075 17136
[61] 17136 17196 17843 17925 17925 18217 18455 18578 18578 18742 18773 18806 19130 19195 …Run Code Online (Sandbox Code Playgroud) 我有一张桌子如下
product=c("a","b","c")
min=c(1,5,3)
max=c(1,7,7)
dd=data.frame(product,min,max)
> dd
product min max
1 a 1 1
2 b 5 7
3 c 3 7
Run Code Online (Sandbox Code Playgroud)
我想创建一个如下所示的表.我想为产品之间的每个值创建一行,包括产品的最小值和最大值
product mm
a 1
b 5
b 6
b 7
c 3
c 4
c 5
c 6
c 7
Run Code Online (Sandbox Code Playgroud)
我怎么能用R做呢?有什么方法能给出快速的结果吗?
在Scala中有一种方法可以比较两个序列,如果它包含相同的元素,它返回true,无论顺序和重复如何?
Seq("1", "2") vs Seq("2", "1") => true
Seq("3", "1", "2") vs Seq("2", "1", "3") => true
Seq("1", "1", "2") vs Seq("2", "1") => true
Run Code Online (Sandbox Code Playgroud)
谢谢
备注:这是不是一个重复的这个,因为它也要求以排除从单向复制,它是不是使用LIST的序列.
我正在使用seq -s"" - f"数据%g:"5来创建
data1 : data2 : data3 : data4 : data 5 :
Run Code Online (Sandbox Code Playgroud)
但是,我想让它开始一些我的选择而不是1而不是在最后有":"符号.例如这样的事情:
data3 : data4 : data5
Run Code Online (Sandbox Code Playgroud)
有没有任何一线解决方案?
提前致谢!
当前输出:
seq -s " " -f " data%g :" 5
data1 : data2 : data3 : data4 : data 5 :
Run Code Online (Sandbox Code Playgroud)
期望:
data3 : data4 : data5
Run Code Online (Sandbox Code Playgroud) 我是Scala的新手,所以希望你能在这个问题中容忍这个问题,如果你发现它是noobish :)
我写了一个函数,它使用yield语法返回一个Seq元素:
def calculateSomeMetrics(names: Seq[String]): Seq[Long] = {
for (name <- names) yield {
// some auxiliary actions
val metrics = somehowCalculateMetrics()
metrics
}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要修改它以返回Map以保留原始名称对每个计算值:
def calculateSomeMetrics(names: Seq[String]): Map[String, Long] = { ... }
Run Code Online (Sandbox Code Playgroud)
我试图使用相同的yield语法,但产生一个元组而不是单个元素:
def calculateSomeMetrics(names: Seq[String]): Map[String, Long] = {
for (name <- names) yield {
// Everything is the same as before
(name, metrics)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器会Seq[(String, Long)]根据编译器错误消息对其进行解释
type mismatch;
found : Seq[(String, Long)]
required: Map[String, Long]
Run Code Online (Sandbox Code Playgroud)
所以我想知道,实现这样的事情的"规范Scala方式"是什么?
我有:
cost = c(2^(-5),2^(-3),2^(-1),2^(1),2^(3),2^(5),2^(7),2^(9),2^(11),2^(13),2^(15))
Run Code Online (Sandbox Code Playgroud)
我想要一个更优雅的命令,例如:
seq(from = 2^(-5), to = 2^(15), by = __)
Run Code Online (Sandbox Code Playgroud)