最近は独学で F# を学んでおり、命令型 (C++/C#) のバックグラウンドを持っています。演習として、加算、乗算、行列式の取得など、行列を処理できる関数に取り組んできました。この点に関してはすべて順調に進んでいますが、処理に関して最善の決定を下していない可能性があります。無効な入力。例:
// 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
この場合、マトリックスの周りに余分なレイヤーを追加するオプションを返しますが、関数の結果を使用することもできます。失敗した場合でも (None)、パターン マッチングなどで、プログラムの後の時点で使用できます。これらのタイプのシナリオのベスト プラクティスはありますか? 関数型プログラマーは何をしますか?