2016-11-27 4 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のカードはvalueと等しいとします。例えば

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どの言語であっても、そのコレクションとそれを操作する関数(関数型言語ではそうかもしれない)に精通していることが役立ちます。これはすばらしい概要です:[Collections&Functions](http://fsharpforfunandprofit.com/posts/list-module-functions/)。 – s952163

答えて

3

としてkeyと呼ばれている、あなたは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") 

は私を与える:

ヴァルそれ:seq.Root> =配列
[{ "コレクター":真、 "健康":4、 "アーティスト": "ゾルタンボロス"、 "type": "MINION"、 "cost":1、 "attack":2};
{ "コレクター":真、 "健康":8、 "アーティスト": "ジェームズ・ライマン"、 "タイプ": "ミニオン"、 "コスト":8、 "攻撃":8}]

+0

それは動作します、ありがとう。残念ながら、私はそれがどのように機能するか完全に把握することはできません。 Seq.filterに条件を渡してテストしましたが、これは問題ありません。私は 'c.'を得るのか分からない。この場合のパラメータは 'deck'でしょうか? – Worice

+0

@Woriceそれは黒い魔法です。 ;-) 'c'はデッキ内のカードを表します(' x'や 'card'と書くことができます)。コレクションは 'map'、' filter'などのように機能します。このケースではカードであるデッキの各要素に作用するので、そのタイプが "MINION"であるときに各カードを与えるように読むことができます。 – s952163

+0

@ウィリスあなたはいつでも[F#チャットルーム](http://chat.stackoverflow.com/rooms/51909/f/)でドロップすることができます – s952163

0

実際にl1の種類に注釈を付ける必要があります。

設定l1: something listは必要なものにする必要があります。型推論としての助けにはならない

キーは上から下であるとx.l2aux前に、引数

+0

あなたの答えはJohnありがとうございます。 – Worice

関連する問題