最近我一直在自学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
在这种情况下,我正在返回一个选项,它在矩阵周围添加了一个额外的层,但我也可以使用函数的结果,在程序的某个后续点中即使是失败案例(无)也可以使用模式匹配等。那么对于这些类型的场景是否有最佳实践?一个函数式编程人员会怎么做?