Охраняемые уравнения в Haskell

может кто-нибудь предоставить мне легко понять объяснение охраняемая уравнение как он используется в Haskell, а также его математическом смысле?

3 ответов


Haskell guards можно рассматривать как математическую функцию, определенную кусочно над входом.

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


охраняемое уравнение-это уравнение (утверждение о равенстве), которое включает в себя то, что называется случае различие. Пример:

fac :: Integer -> Integer
fac n | n > 0     = n * fac (n - 1)
      | otherwise = 1

это определение функции факториала. Математики напишут:

Latex

0! = 1 по определению. Для всех значений n больше 0, n! можно определить в терминах (n - 1)!. Это не относится к 0!. Именно по этой причине необходимо различать два случая. И это то, что делает охраняемое уравнение.


охраняемое уравнение является эквивалентной конструкцией Хаскелла функция кусочно.