Вы можете проверить тип в GHCi с :t
, как указано в других ответах. Если вы хотите попытаться выяснить это самостоятельно, вам нужно подставить типы в зависимости от ситуации. В первом примере мы имеем
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
и
map :: (a -> b) -> [a] -> [b]
Первый аргумент map
является функцией одного аргумента, поэтому мы должны рассматривать zipWith
в качестве такой функции:
zipWith :: (a -> b -> c) -> ([a] -> [b] -> [c])
(Тип, приведенный выше, эквивалентен первому. Это означает, что zipWith
преобразует функцию, которая принимает аргументы типов a
и b
функции, которая принимает списки a
и b
)
map
можно рассматривать как функцию одного аргумента, а:.
map :: (a -> b) -> ([a] -> [b])
Теперь мы заполняем типов в map
-х тип результата - a
становится a -> b -> c
и b
становится [a] -> [b] -> [c]
:
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]
PS: Есть ли у вас действительно хотят функции, которые принимают списки функций в качестве аргументов? Если вы просто хотите, чтобы пронестись два списка добавляющих соответствующих элементов, которые вы хотите
zipWith (+) :: Num c => [c] -> [c] -> [c]
, а не zipWith sum
.
Вопрос о проверке в ghci или о проверке вручную/в вашем уме? – nponeccop