2016-04-04 9 views
1

に変換する私は、関数型プログラミングだけでなく、F#言語もかなり新しく、マップデータ構造の実装に問題があります。この地図のC#の型と同等は次のようになります。複雑なマップデータ構造をF#

var map = new Dictionary<int, Dictionary<int, Tuple<char, Tuple<int, int>[]>[]>>(); 

私はこの自分自身を実装しようとしたオンラインで検索、しかし、言語との私の経験不足は私をダウンさせて頂いておりました。

は私を見ることができ、誰です:

  1. この構造
  2. このような例可変実装
+0

あなたは何をしっかりつかんでいますか?既存のタイプを動作させることはできませんか、独自のタイプを作成しようとしていますか? –

+0

@JohnPalmer私は何よりも文法に執着しています。私は地図を作ることができ、リストとタプルを作ることができますが、これらのすべてがこの構造に織り込まれているわけではありません。 – Hayden

+0

いくつかの試行を見せてもらえますか?また、英語で何をしたいか説明してください。または、おそらく、同等のC#またはVBコードを少なくとも表示しますか? –

答えて

2

の不変の実装:

let t1 = (2,3) 
let t2 = ("a",t1) 
let m1 = Map([1,t2]) 
let m2 = Map([2,m1]) 

の署名これは:

val it : Map<int,Map<int,(string * (int * int))>> = map [(2, map [(1, ("a", (2, 3)))])] 

これは配列ではなく配列を使用しています。

変更可能部分については、既に実装を示しています。ただ、

System.Collections.Generic.Dictionary 

わからないを使用しますが、多分これはあなたのために有用である:F# map to C# Dictionary

+0

あなたの返信ありがとう、私はあなたが投稿したコードについていくつかの質問があります:1)(int * int)リスト内の1つの文字、可能であれば答えを更新できますか?2)最初のマップが空のマップの値を持つデフォルト値を初期化するにはどうすればよいでしょうか? – Hayden

+0

私はこの回答に基づいて私が欲しかったことを理解したと思う、ありがとう! – Hayden

+0

'Map.empty 'を実行し、1)タプルをリストに入れます。ああ、申し訳ありません、あなたは私より早かったです。確かに。 – s952163

4

単なる翻訳は非常に簡単です:どちらか

  • Dictionary(あなたは不変の構造をしたい場合)Mapなりますかそれがそのままです(変更可能な場合)
  • Tuple<a, b>は型宣言でa * bになり、(x, y)を変数に使用しています。したがって

我々は不変で行くならば、我々が得る:

Map<int, Map<int, (string * (int * int)[])[]>> 

しかし、それは、率直に言って、読めないのです。幸いにも、F#はこのための完璧なソリューションを持っています:type abbreviations。複合タイプは人間の読者に、より明確に問題領域を発現エイリアス、又は略語の束に分解することができること

。たとえば、あなたが持っている可能性があり:

type Cell = int * int 

type Zone = Cell [] 

type Battleship = string * Zone 

type Flotilla = Battleship [] 

type TaskForce = Map<int, Flotilla> 

type Fleet = TaskForce [] 

type NavalTheater = Map<int, Fleet> 

を上記のようにまったく同じタイプであるが、それはほとんどのユースケースのために、たくさんより読みますました。コンパイル時に省略形が単純にネイティブの型に置き換えられるので、それはゼロオーバーヘッドを持ちます。

+0

これは非常にきちんとしたソリューションです! – Hayden

関連する問題