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

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

• Тип f не содержит стрелок, или f не является функцией.

• Типы x и аргумента для f не совпадают.

Вот и все ошибки. Универсальное представление всех функций в виде функций одного аргумента, значи-

тельно сокращает число различных видов ошибок. Итак мы можем ошибиться применяя значение к константе

и передав в функцию не то, что она ожидает.

Потренируемся в интерпретаторе, сначала попытаемся создать ошибку первого типа:

*Nat> Zero Zero

< interactive>:1:1:

The function ‘Zero’ is applied to one argument,

but its type Nat’ has none

In the expression: Zero Zero

In an equation for ‘it’: it = Zero Zero

Если перевести на русский интерпретатор говорит:

*Nat> Zero Zero

< interactive>:1:1:

Функция ’Zero’ применяется к одному аргументу,

но её тип ’Nat’ не имеет аргументов

В выражении: Zero Zero

В уравнении для ‘it’: it = Zero Zero

Компилятор увидел применение функции f x, далее он посмотрел, что x = Zero, из этого на основе

правила применения он сделал вывод о том, что f имеет тип Nat -> t, тогда он заглянул в f и нашёл там

Zero :: Nat, что и привело к несовпадению типов.

Составим ещё одно выражение с такой же ошибкой:

*Nat> True Succ

< interactive>:6:1:

The function ‘True’ is applied to one argument,

but its type Bool’ has none

In the expression: True Succ

In an equation for ‘it’: it = True Succ

В этом выражении аргумент Succ имеет тип Nat -> Nat, значит по правилу вывода тип True равен (Nat

-> Nat) -> t, где t некоторый произвольный тип, но мы знаем, что True имеет тип Bool.

Теперь перейдём к ошибкам второго типа. Попробуем вызывать функции с неправильными аргументами:

*Nat> :m +Prelude

*Nat Prelude> not (Succ Zero)

< interactive>:9:6:

Couldn’t match expected type Bool’ with actual type Nat’

In the return type of a call of Succ’

In the first argument of ‘not’, namely ‘(Succ Zero)’

In the expression: not (Succ Zero)

50 | Глава 3: Типы

Опишем действия компилятора в терминах правила применения. В этом выражении у нас есть три зна-

чения: not, Succ и Zero. Нам нужно узнать тип выражения и проверить правильно ли оно построено.

not (Succ Zero) - ?

not :: Bool -> Bool,

Succ :: Nat -> Nat,

Zero :: Nat

----------------------------------------------------------

f x, f = not и x = (Succ Zero)

------------------------------------------------------------

f :: Bool -> Bool следовательно x :: Bool