これは、同様のC#の質問に対する恥知らずな試みです。
では、お気に入りの F# の非表示 (または非表示) 機能は何ですか?
これまで使ってきた機能のほとんどは完全に隠されているわけではありませんが、かなり新鮮です。たとえば、C# や VB.NET と比較して、演算子をオーバーロードするのは簡単です。
そしてAsync<T>
、本当に醜いコードを削るのに役立ちました。
私はまだ言語に慣れていないので、他の機能が実際に使用されていることを学ぶことは素晴らしいことです.
これは、同様のC#の質問に対する恥知らずな試みです。
では、お気に入りの F# の非表示 (または非表示) 機能は何ですか?
これまで使ってきた機能のほとんどは完全に隠されているわけではありませんが、かなり新鮮です。たとえば、C# や VB.NET と比較して、演算子をオーバーロードするのは簡単です。
そしてAsync<T>
、本当に醜いコードを削るのに役立ちました。
私はまだ言語に慣れていないので、他の機能が実際に使用されていることを学ぶことは素晴らしいことです.
ユーザー定義の数値リテラルは、名前が で始まり、NumericLiteral
特定のメソッド ( 、 など) を定義FromZero
するFromOne
モジュールを提供することで定義できます。
LanguagePrimitives.GenericZero
特に、これを使用して、 andを呼び出すためのはるかに読みやすい構文を提供できますLanguagePrimitives.GenericOne
。
module NumericLiteralG = begin
let inline FromZero() = LanguagePrimitives.GenericZero
let inline FromOne() = LanguagePrimitives.GenericOne
end
let inline genericFactorial n =
let rec fact n = if (n = 0G) then 1G else n * (fact (n - 1G))
fact n
let flt = genericFactorial 30.
let bigI = genericFactorial 30I
F# には、「署名ファイル」と呼ばれるあまり使用されない機能があります。public型/メソッド/モジュール/関数でいっぱいの大きな実装ファイルを持つことができますが、その機能を非表示にして、署名ファイルを介してプログラムの続編に選択的に公開することができます。つまり、署名ファイルは、エンティティを「このファイルに対して公開」し、「プログラムの残りの部分に対しては非公開」にすることを可能にする一種の画面/フィルターとして機能します。
この種のカプセル化のための唯一の他の/以前のツールはアセンブリであるため、これは .Net プラットフォームではかなりキラーな機能だと思います。相互の内部詳細を表示できるようにしたいが、それらの型のすべてのビットを全員に公開したくない、関連するいくつかの型を持つ小さなコンポーネントがある場合、何ができますか? さて、あなたは2つのことをすることができます:
私の経験では、大規模なソフトウェア プロジェクトでは、誰もが常に #2 を実行します。これは、#1 がさまざまな理由でスターターではないためです (人々は 50 個の小さなアセンブリを必要としない、1 つまたは 2 つまたは 3 つの大きなアセンブリが必要な場合など)。私が提起しているカプセル化ポイントとは無関係の正当な理由(余談ですが、誰もがILMergeについて言及していますが、誰も使用していません))。
したがって、オプション #2 を選択しました。それから 1 年後、最終的にそのコンポーネントをリファクタリングすることを決定し、過去 1 年間で、他の 17 の場所がその「内部」メソッドを呼び出すようになったことを発見しました。誰もがそれらの実装の詳細に依存しているため、そのビットを除外するのは困難です。残念。
ポイントは、.Net で適度なサイズのアセンブリ内カプセル化スコープ/境界を作成する良い方法がないということです。多くの場合、「内部」は大きすぎ、「プライベート」は小さすぎます。
... F# まで。F# 署名ファイルを使用すると、実装ファイル内で一連のものをパブリックとしてマークすることで、「このソース コード ファイル」のカプセル化スコープを作成できます。すべての詳細を隠す署名ファイルは、コンポーネントが他の世界に公開する狭いパブリック インターフェイスを想定しています。これは嬉しい。関連性の高い 3 つの型を 1 つのファイルに定義し、それぞれが他の実装の詳細を確認できるようにしますが、真に公開されているものだけを他のすべての人に公開します。勝つ!
署名ファイルは、アセンブリ内のカプセル化の境界にとって理想的な機能ではないかもしれませんが、私が知っている唯一の機能であるため、海の救命いかだのようにそれらにしがみつきます。
TL;DR
複雑さは敵です。カプセル化境界は、この敵に対する武器です。「プライベート」は優れた武器ですが、小さすぎて適用できない場合があり、「内部」は多くのコード (アセンブリ全体とすべての InternalsVisibleTo) が内部のものを見ることができるため、弱すぎることがよくあります。F# は、「型のプライベート」よりも大きく、「アセンブリ全体」よりも小さいスコープを提供します。これは非常に便利です。
追加したらどうなるか気になる
<appSettings>
<add key="fsharp-navigationbar-enabled" value="true" />
</appSettings>
あなたの devenv.exe.config ファイルに?(自己責任。)
コンパイラに渡す--warnon:1182
と、未使用の変数に関する警告がオンになります。アンダースコアで始まる変数名は影響を受けません。
代数データ型の自動生成された比較関数 (辞書編集順序に基づく) は、比較的知られていない優れた機能です。見る
http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!548.entry
たとえば。
はい、F# には「隠れた」機能はありませんが、単純な言語に多くの機能が詰め込まれていることは確かです。この言語のあまり知られていない機能は、F# が静的に型付けされているにもかかわらず、基本的にダック タイピングを有効にできることです。
実際には隠されているわけではありませんが、ML を使用していない人として、これはかなり長い間私を逃れました。
パターン マッチングは、任意の深さのデータ構造に分解できます。
[信じられないほど恣意的な] ネストされたタプルの例を次に示します。これは、リストまたはユニオン、またはネストされた値の任意の組み合わせで機能します。
let listEven =
"Manipulating strings can be intriguing using F#".Split ' '
|> List.ofArray
|> List.map (fun x -> (x.Length % 2 = 0, x.Contains "i"), x)
|> List.choose
( function (true, true), s -> Some s
| _, "F#" -> Some "language"
| _ -> None )
ユーティリティ スクリプト言語としての F# の使用は、過小評価される可能性があります。F# 愛好家はクオンツである傾向があります。MP3 (または数十のデータベース サーバー) をバックアップするために、バッチよりも少し堅牢な何かが必要な場合があります。私は jscript / vbscript の最新の代替品を探していました。最近、IronPython を使用していますが、F# の方がより完全であり、.NET とのやり取りはそれほど面倒ではありません。
私は娯楽的価値のためにカリー化された関数が好きです。少なくとも 3 つの WTF に対して、カリー化された関数を純粋な手続き型 / OOP プログラムに表示します。ただし、これから始めるのは F# の変換者を獲得するための悪い方法です :)
F# はデザイン モードであるため、隠し機能はありません。私たちが持っているのは、2 か月ごとに変更されるテクニカル プレビューだけです。
http://research.microsoft.com/fsharp/を参照してください。