最近私はF#を教えてきました。私は命令的な(C++/C#)のバックグラウンドから来ています。練習として、私は行列を使って、行列を追加、乗算、行列式などを得ることができる関数に取り組んできました。この点に関してはすべてがうまくいっていますが、扱いに関係するときには、例えば、無効な入力、:F#:Some、None、またはException?
// I want to multiply two matrices
let mult m1 m2 =
let sizeOK = validateDims m1 m2
// Here is where I am running to conceptual trouble:
// In a C# world, I would throw an exception.
if !sizeOK then
raise (InvalidOperationException("bad dimensions!")
else
doWork m1 m2
だから、これは技術的に動作しますが、これは関数型言語に適しているのですか?関数型プログラミングの精神ですか?私も失敗に、マトリックスの周りに余分なレイヤを追加しますが、私は、関数の結果を使用することができますオプションを、帰国しています。この場合
let mult m1 m2 =
let sizeOK = validateDims m1 m2
if !sizeOK then
None
else
Some doWork m1 m2
:として、あるいはそれを書き換えるために、より理にかなってパターンマッチングのあるケース(なし)などがあります。このようなシナリオにはベストプラクティスがありますか?機能的なプログラマは何をしますか?
私は後者がFPの「精神」にあると考えています。 Maybeモナドだけでなく、悪い入力を処理するための一般的なアプローチを調べることができます。 –
Padが答えて言ったように、私はしばしばエラーをスローする関数とスローするのではなくOption/Choiceを返す同じtry-functionの2つの関数を実装します。私は最終的なコードを最も美しく見せるものを使用しています:)あなたが "鉄道指向のプログラミング"を読んでみたいかもしれないオプション/選択肢の処理のために:http://fsharpforfunandprofit.com/posts/recipe-part2/ – stmax