Каковы преимущества сопоставления с образцом по сравнению с условными в FP (в терминах непрофессионала)? - PullRequest
5 голосов
/ 06 октября 2019

С точки зрения непрофессионала , какие именно преимущества сопоставления с образцом, кроме исторических причин? Ответы, с которыми я столкнулся, в основном выходят за рамки моего уровня (например, я не понимаю, какое отношение к этому имеет распределение кучи).

У меня есть опыт работы с Python, только недавно я снова перешел на Haskell.

Поэтому мне было трудно понять другие ответы, данные в контексте других языков.

1 Ответ

10 голосов
/ 06 октября 2019

Один из наиболее полезных аспектов использования сопоставления с образцом вместо условных выражений - разрешить 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, но вылетает при недопустимомвходы.

Последнее довольно плохо, так как это накладывает некоторую нагрузку на программиста, который должен помнить, чтобы спросить «могу ли я?», Или рискнуть сбой.

...