2016-03-30 12 views
0

Bir tür veya başka birini döndüren bir işlev çalışıyorum. F # olmadan bu kodlamak için yeni bir ayrımcı sendika türü oluşturmak ve bu ayrımcılık birliği işlevden döndürmek için herhangi bir yolu var mı?F #: Tek bir işlevden farklı türlerdeki değerlerin döndürülmesi

type Json = JNumber of float 
      | JString of string 
      | JArray of seq<Json> 
      | JObject of Map<string, Json> 
      | JBool of bool 
      | JNull 

let parseJson(jason:Json) = match jason with 
          |JNumber num -> num 
          |JString str -> str 
          |JArray arr -> arr |> Seq.map (fun e -> parseJson e) 
          |JObject obj -> obj |> Seq.map (fun (k,v) -> (k, parseJson v)) |> Map.ofArray 
          |JBool boo -> boo 
          |JNull  -> None 

Esasen ben F # veriyapılarıdır içine Json nesnesi çevirmek isterler: Burada

derlemek olmaz basit bir örnektir. (Bazı arka plan için, metin dönüştüren bir oyuncak json ayrıştırıcısı yazıyorum -> Json nesnesi -> F # veri yapıları ayrı adımlarda)

+3

ve gerçekten mümkün değil. Basit sebep varsayalım, x 'parseJson' 'x' türünün ne olduğunu' - 'x + 1' satırını derlemeli mi? etc –

+0

@JohnPalmer Bu ne tür bir sağlayıcı için değil mi? Benim düşüncem soru doğru değil, ama cevap bir "tip sağlayıcı" oluşturmak ... Gnicholas için: https://msdn.microsoft.com/en-us/library/hh361034.aspx ya da kontrol edin: http://fsharp.github.io/FSharp.Data/library/JsonProvider.html ve muhtemelen bunun için kaynak https://github.com/fsharp/FSharp.Data/tree/master/src/Json –

+0

@HelgeReneUrholm Bir tür sağlayıcının aslında karmaşık bir tür döndürdüğünü unutmayın. Aslında bir şablon dosyasına ihtiyaç duyar, böylece derleme zamanında türleri üretebilir. Çalışma zamanında yeni bir dosya kullanırsanız, şablon ile aynı biçime sahip olması gerekir. –

cevap

1

Bu sizin için iyi bir fikir değil. puan. Böyle bir işlevin nasıl kullanılacağını düşünün, desen eşleştirmesi yapamayacaksınız.

Bunun gibi bir işlev için, her bir değeri box ile obj'e atabilirsiniz, ancak parseJson işlevinizi kullanmanız gerektiğinde her defasında döküm içine sıkışmış olursunuz Çalışır, ancak iyi olmaz .

böyle bir şey söz ediyorum: Bu kez bir sürü istendi https://stackoverflow.com/a/2994300/1485641

+1

Ben de böyle düşündüm. Ama bir sormaya değer. Teşekkürler! – gnicholas

İlgili konular