Я учил себя F # в последнее время, и я исхожу из императивного (С++/С#) фона. В качестве упражнения я работал над функциями, которые могут делать вещи с помощью матриц, например, добавлять, умножать, получать детерминанты и т.д. В этом отношении все идет хорошо, но я считаю, что, возможно, я не принимаю наилучших решений, когда это касается обработки неверные входы, например:
// 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
В этом случае я возвращаю параметр, который добавляет дополнительный слой вокруг матрицы, но я мог бы также использовать результаты функции, даже в случаях сбоя (Нет) с сопоставлением шаблонов и т.д. в какой-то более поздний момент в программа. Итак, есть ли наилучшая практика для этих типов сценариев? Что сделал бы функциональный программист?