Я бы обычно использовал сопоставление с образцом, тем более что вы используете все аргументы конструктора, а их не так много.Кроме того, в этом примере это не проблема, но учтите следующее:
data Foo = A {a :: Int} | B {b :: String}
fun x = a x + 1
Если вы используете сопоставление с образцом для работы с типом Foo, вы в безопасности;невозможно получить доступ к члену, который не существует.Если вы используете функции доступа с другой стороны, некоторые операции, такие как вызов fun (B "hi!")
, приведут к ошибке во время выполнения.
РЕДАКТИРОВАТЬ: хотя, конечно, вполне можно забыть сопоставить какой-либо конструктор, сопоставление с образцомдовольно ясно показывает, что то, что происходит, зависит от того, какой конструктор используется (вы также можете указать компилятору обнаруживать и предупреждать вас о неполных шаблонах), тогда как использование функции намекает больше, чем любой конструктор, IMO.
Средства доступа лучше всего сохранять в тех случаях, когда вы хотите получить только один или несколько аргументов конструктора (потенциально много), и вы знаете, что их безопасно использовать (без риска использования средства доступа в неправильном конструкторе, как в примере.)