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