Каков тип этой двойной функции в haskell?

t2 = (\x y z-> x.y.x)

GHCI показывает мне это:

t2 :: (b1 -> b2) -> (b2 -> b1) -> p -> b1 -> b2

Я не могу понять, как эта сигнатура типа появляется. До сих пор я полагал, что самый правый х в основном является функцией, которая принимает b2 и возвращает b1тогда b1 является входом средней функции yи выходы b2снова? Если он не возвращает значение нового типа b3или что-то?

1 ответ

Решение

Сначала давайте перепишем это так, чтобы было понятно, какой аргумент соответствует какой части сигнатуры типа:

t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2    x           y           z  = x . y . x

z :: p не используется вообще, поэтому мы можем легко устранить это, взглянув на

t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3    x           y         = x . y . x

Почему это тип? Ну, состав цепочки кормит результат x в yи результат y Вернуться в x, Другими словами, y получает вас от типа результата x вернуться к типу аргумента x, Поэтому тип y должен быть "перевернутым" типом x, Так

t3 :: (m->n) -> (n->m) -> ?
t3    x         y       = x . y . x

В типе композиции преобладают "внешние концы", то есть аргумент должен быть типом аргумента для x и результат должен быть типом результата... опять же, x, следовательно

t3 :: (m->n) -> (n->m) -> m->n
t3    x         y       = x.y.x

это то, что сказал вам GHCi с переименованными переменными типа.

Другие вопросы по тегам