私はVisual Studio 2010でF#を試しています。私はC#やJavaなどのオブジェクト指向言語でより多くのコード/アーキテクチャ設計経験を持つ開発者です。F#のコーディングプラクティス
私のスキルセットを広げ、より良い決定を下すために、私はさまざまなことをするためにさまざまな言語を試しています。特に、関数型言語(この場合はF#)を使用してコーディングを「正しく」行うことができます。
単純な例では、いくつかのXMLを生成してから、いくつかのフィルタを追加していくつかの要素を削除しています。
ここが私のコードです:
open System
open System.Xml.Linq
let ppl:(string * string) list = [
("1", "Jerry");
("2", "Max");
("3", "Andrew");
]
/// Generates a Person XML Element, given a tuple.
let createPerson (id:string, name:string) = new XElement(XName.Get("Person"),
new XAttribute(XName.Get("ID"), id),
new XElement(XName.Get("Name"), name)
)
/// Filter People by having odd ID's
let oddFilter = fun (id:string, name:string) -> (System.Int32.Parse(id) % 2).Equals(1)
/// Open filter which will return all people
let allFilter = fun (id:string, name:string) -> true
/// Generates a People XML Element.
let createPeople filter = new XElement(XName.Get("People"),
ppl |> List.filter(filter) |> List.map createPerson
)
/// First XML Object
let XmlA = createPeople oddFilter
/// Second XML Object
let XmlB = createPeople allFilter
printf "%A\n\n%A" XmlA XmlB
/// Waits for a keypress
let pauseKey = fun() -> System.Console.ReadKey() |> ignore
pauseKey()
私の質問は以下のとおりです。物事は、私は、このシナリオでうまくやっていますか?どの部分をより良くすることができるでしょうか?
私は実際にいくつかのアイデアを楽しみにしており、機能的なパラダイムにも慣れ親しむことに非常に興奮しています! :)事前に
おかげで
+1ここと全く同じ状況ですが(明らかに異なるコードを使用しています)、これに対する回答を見ることができます。 – Jay
F#は基本的にはタイプを表すように作られていますので、非常に強力な推論エンジンを持っていますので、タイプアノテーションを省略し、できるだけ汎用的な関数にする必要があります。 – 0xFF
@martain_net実際にはたくさんの意味があります:)異なるネイティブのF#タイプ(例えば(string * string)リストは2つの文字列を持つタプルのリストを意味します)を理解するために型定義を過ぎてしまったと思います。 – Russell