尝试创建一个函数,然后按“过滤”筛选序列;不是那个功能;在F#
我的数据是一系列:尝试创建一个函数,然后按“过滤”筛选序列;不是那个功能;在F#,f#,F#,我的数据是一系列: [(40,“TX”);(48,“MO”);(15,“TX”);(78,“TN”);(41,“VT”)] 我的代码如下: type Csvfile = CsvProvider<somefile> let data = Csvfile.GetSample().Rows let nullid row = row.Id = 15 let otherid row = row.Id= 40 let iddata = data |>
[(40,“TX”);(48,“MO”);(15,“TX”);(78,“TN”);(41,“VT”)]
我的代码如下:
type Csvfile = CsvProvider<somefile>
let data = Csvfile.GetSample().Rows
let nullid row =
row.Id = 15
let otherid row =
row.Id= 40
let iddata =
data
|> Seq.filter (not nullid)
|> Seq.filter (not otherid)
类型Csvfile=CsvProvider
让data=Csvfile.GetSample().Rows
设空ID行=
行Id=15
让其他ID行=
行Id=40
让iddata=
数据
|>Seq.filter(非空ID)
|>序号过滤器(非其他ID)
我创建函数
然后我想调用这些函数中的“not”,将它们从序列中过滤出来
但问题是,我在前两个函数中得到了“row.Id”的错误,因为您只能使用类型来执行此操作
我如何解决这个问题,才能成功地完成这个任务
我的结果应该是一系列:
[(48,“MO);(78,“TN”);(41,“VT”)]
您可以使用>
运算符组合两个函数:
let iddata =
data
|> Seq.filter (nullid >> not)
|> Seq.filter (othered >> not)
看
或者,您可以使其更加明确:
let iddata =
data
|> Seq.filter (fun x -> not (nullid x))
|> Seq.filter (fun x -> not (othered x))
你可以在行动中看到:
let input = [|1;2;3;4;5;6;7;8;9;10|];;
let is3 value =
value = 3;;
input |> Seq.filter (fun x -> not (is3 x));;
input |> Seq.filter (not >> is3);;
它们都打印
valit:seq=seq[1;2;4;5;…]
请参见下面的MCVE在您的案例中的外观,对于fsx文件,您可以使用\r
引用Fsharp.Data
dll,对于已编译的项目,只需引用dll并打开它即可
#if INTERACTIVE
#r @"..\..\SO2018\packages\FSharp.Data\lib\net45\FSharp.Data.dll"
#endif
open FSharp.Data
[<Literal>]
let datafile = @"C:\tmp\data.csv"
type CsvFile = CsvProvider<datafile>
let data = CsvFile.GetSample().Rows
现在回到您的原始帖子,正如您正确指出的,您的函数将显示一个错误,因为您将其定义为泛型,但它需要对特定的Csv行类型(具有Id属性)进行操作。这很容易修复,只需在行
参数中添加一个类型注释。在这种情况下,您的类型是CsvFile.row
,并且由于CsvFile.row具有Id属性,我们可以在函数中访问该属性。现在,此函数返回布尔值。您可以让它也返回实际的行
let nullid (row: CsvFile.Row) =
row.Id = 15
let otherid (row: CsvFile.Row) =
row.Id = 40
然后剩下的就是在一个序列过滤器中应用它,并对其求反:
let iddata =
data
|> Seq.filter (not << nullid)
|> Seq.filter (not << otherid)
|> Seq.toList
//val iddata : CsvProvider<...>.Row list = [(48, "MO"); (78, "TN"); (41, "VT")]
让iddata=
资料
|>序号过滤器(非序号过滤器(非序号列表
//validdata:CsvProvider.Row list=[(48,“MO”);(78,“TN”);(41,“VT”)]
您能提供一个吗?我还应该添加什么?这基本上是我无法复制、粘贴和运行您的代码的所有内容。请让我们很容易回答。最简单的部分应该意味着我不需要担心CSV文件-我想这不会导致问题。因此,请给我们合理的输入数据、您的规则和您的期望值结果。@Enigmatity我的问题已更新。您可以添加类型批注或使用SRTP。此外,您应该在元组之间用;
分隔项目,而不是。关键的方面是,我需要能够从CSV调用行。例如“row.Id”“。我认为OP的问题是他无法访问Id
属性,因为泛型类型当然不能有此属性。只有特定类型(限制为具有Id属性)才能有此属性,或者您需要使用类型注释来明确函数仅对该类型操作,而不是泛型。
let nullid (row: CsvFile.Row) =
row.Id = 15
let otherid (row: CsvFile.Row) =
row.Id = 40
let iddata =
data
|> Seq.filter (not << nullid)
|> Seq.filter (not << otherid)
|> Seq.toList
//val iddata : CsvProvider<...>.Row list = [(48, "MO"); (78, "TN"); (41, "VT")]