Каков тип этой двойной функции в 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 с переименованными переменными типа.