2016-11-27 57 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