Один из наиболее полезных аспектов использования сопоставления с образцом вместо условных выражений - разрешить API-интерфейсам, включающим только всего операций, то есть операций, которые никогда не вызывают исключений / ошибок во время выполнения.
Рассмотрим этот код, используя гипотетическую функцию runOperationOn
, возвращая Maybe String
.
case runOperationOn someData of
Just res -> putStrLn ("The operation was successful: " ++ res)
Nothing -> putStrLn "The operation failed!"
Здесь сопоставление с образцом позволяет проверить, была ли операция выполнена успешно, и получить результат в случае успеха, одновременно . Последняя часть имеет решающее значение. Используя логические значения, нам нужно было бы использовать что-то вроде:
if canRunOperationOn someData
then putStrLn ("The operation was successful: " ++ doRunOperationOn someData)
else putStrLn "The operation failed!"
Это выглядит аналогично, но имеет существенные недостатки по сравнению с сопоставлением с шаблоном:
- Он разделяет функциональность на две функции: один, чтобы проверить, можем ли мы выполнить операцию, и один, чтобы фактически сделать это.
- Она включает частичную функцию
doRunOperationOn
, которая возвращает String
, но вылетает при недопустимомвходы.
Последнее довольно плохо, так как это накладывает некоторую нагрузку на программиста, который должен помнить, чтобы спросить «могу ли я?», Или рискнуть сбой.