Может ли кто-нибудь предоставить мне легкое для понимания объяснение защищенного уравнения, как он используется в Haskell, а также его математический смысл?
Охранные уравнения в Хаскелле
Ответ 1
Защитники Haskell можно рассматривать как математическую функцию, определенную кусочно над входом.
foo x | x < 0 = bar
| x < 5 = baz
| x < 20 = quux
| otherwise = quaffle
был бы написан математиком типа:
foo(x) = { bar, if x < 0
baz, if x >= 0 && x < 5
quux, if x >= 5 && x < 20
quaffle, if x >= 20
Каждый из охранников в функции Haskell неявно несет отрицание всех охранников, которые предшествуют ему, потому что они проверяются один за другим.
Haskell решает написать охрану слева от знака равенства, чтобы облегчить отслеживание потока управления. Если вы решите прочитать | как "такое, что", тогда оно становится довольно интуитивным.
Ответ 2
Защищенным уравнением является уравнение (утверждение о равенстве), которое включает в себя то, что называется разграничением случаев. Пример:
fac :: Integer -> Integer
fac n | n > 0 = n * fac (n - 1)
| otherwise = 1
Это определение факториальной функции . Математики напишут,
0!= 1, по определению. Для всех значений n больше 0, n! может быть определена в терминах (n - 1)!. Это не относится к 0!. Именно по этой причине необходимо различать два случая. И это то, что делает защищенное уравнение.
Ответ 3
Защищенным уравнением является эквивалентная конструкция Haskell кусочная функция.