52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 62

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 62

и организовывать условные вычисления которые зависят от вида поступающих на вход функции значений

not True

= False

not False = True

Сопоставление с образцом

Декомпозицию в декларативном стиле мы уже изучили, это обычный случай разбора значений в аргу-

ментах функции. Рассмотрим одну полезную возможность при декомпозиции. Иногда нам хочется провести

декомпозицию и дать псевдоним всему значению. Это можно сделать с помощью специального символа @.

Например определим функцию, которая возвращает соседние числа для данного числа Пеано:

beside :: Nat -> (Nat, Nat)

beside

Zero

= error ”undefined”

beside

x@(Succ y) = (y, Succ x)

В выражении x“(Succ y)@ мы одновременно проводим разбор и даём имя всему значению.

Декомпозиция | 61

case-выражения

Оказывается декомпозицию можно проводить в любом выражении, для этого существуют case-

выражения:

data AnotherNat = None | One | Two | Many

deriving (Show, Eq)

toAnother :: Nat -> AnotherNat

toAnother x =

case x of

Zero

-> None

Succ Zero

-> One

Succ (Succ Zero)

-> Two

_

-> Many

fromAnother :: AnotherNat -> Nat

fromAnother None

= Zero

fromAnother One

= Succ Zero

fromAnother Two

= Succ (Succ Zero)

fromAnother Many

= error ”undefined”

Слова case и of – ключевые. Выгодным отличием case-выражений является то, что нам не приходит-

ся каждый раз выписывать имя функции. Обратите внимание на то, что в case-выражениях также можно

пользоваться обычными переменными и безымянными переменными.

Для проведения декомпозиции по нескольким переменным можно воспользоваться кортежами. Например

определим знакомую функцию равенства для Nat:

instance Eq Nat where

(==) a b =

case (a, b) of