Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试创建一个函数,然后按“过滤”筛选序列;不是那个功能;在F#_F# - Fatal编程技术网

尝试创建一个函数,然后按“过滤”筛选序列;不是那个功能;在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")]