2016-11-27 61 views
0

请考虑此数据集:子集JSON数据

type Deck = JsonProvider<"..."> 
let dt = Deck.GetSamples() 

dt 

[{"collectible":true,"health":4,"artist":"Zoltan Boros","type":"MINION","cost":1,"attack":2}, 
{"collectible":true,"health":8,"artist":"James Ryman","type":"MINION","cost":8,"attack":8}, 
{"collectible":true,"health":3,"artist":"Warren Mahy", "type":"LAND","cost":2,"attack":2}] 

我试图建立能够提取它的某些信息的功能,并最终将它们存储在一个较小的数据集。它应该,考虑到类似列表的数据集deck,只考虑对于key s等于value s的卡。

let rec filter deck key value = 
    let rec aux l1 l2 l3 = 
     match l1 with 
     [] -> [] 
     | x::xs when x.l2 = l3 -> x::(aux xs key value) 
    aux deck key value 

例如,

filter dt type minion 

应子集的甲板中较小的一个只与第一和第二卡。我觉得我做向前走了几步中获得的概念,但它仍然无法正常工作,扔我应该如何定义key类型的那种

FS0072: Lookup on object of indeterminate type based on information prior to 
this program point. A type annotation may be needed prior to this program point to 
constrain the type of the object. This may allow the lookup to be resolved. 

错误?我试着用key : stringkey : string list,但没有成功。

+1

为什么?我不认为你可以将代码解释为一个没有''''操作符的引号的字符串,但是无论如何,它首先会违背类型提供者的观点。使用过滤器函数有什么问题,比如'fun(c:Deck.Root) - > c.Type =“MINION”'? – Vandroiy

+1

@Vandroiy,过滤函数没有错。我根本不知道他们。感谢您向我展示它。 – Worice

+0

@Worice在任何语言中,它都有助于熟悉它的集合和对它们进行操作的函数(在功能语言中可能更多)。这是一个很好的概述:[集合和函数](http://fsharpforfunandprofit.com/posts/list-module-functions/)。 – s952163

回答

3

你们是不是要重新实现filter

#if INTERACTIVE 
#r @"..\packages\FSharp.Data\lib\net40\FSharp.Data.dll" 
#endif 

open FSharp.Data 

[<Literal>] 
let jsonFile = @"C:\tmp\test.json" 

type Json = JsonProvider<jsonFile> 
let deck = Json.Load(jsonFile) 

deck |> Seq.filter (fun c -> c.Type = "MINION") 

给我:

VAL它:seq.Root> = SEQ
[{ “收藏”:真正的 “健康”:4, “艺术家”: “佐尔坦博罗什” “type”:“MINION”,“cost”:1,“attack”:2};
{ “收藏”:真正的 “健康”:8, “艺术家”: “詹姆斯·赖曼”, “类型”: “马仔”, “成本”:8, “攻击”:8}]

+0

它的工作原理,谢谢。不幸的是,我无法完全掌握它的工作原理。你只是传递给Seq.filter一个条件来测试,这没关系。我不确定我是否会得到'c.'。在这种情况下,参数是'deck'吗? – Worice

+0

@Worice它是黑色的magiks。 ;-)'c'表示卡组中的卡(可以写'x'或'card')。集合函数像'map','filter'等。将会在牌组中的每个单独元素上进行操作,在这种情况下是一张牌,所以您可以在Type为“MINION”时给予每张牌。 – s952163

+0

@Worice你可以随时通过[F#聊天室](http://chat.stackoverflow.com/rooms/51909/f/) – s952163

0

您实际上需要注释l1的类型。

设置l1: something list应该是你想要的。

主要于事无补类型推断是从上到下,x.l2aux之前被调用key作为参数

+0

谢谢你的回答约翰。 – Worice