2013-10-10 7 views
1

Предположим, у меня есть функция вроде map zipWith, как я могу определить ее тип? Учитывая, что тип zipWith является (a -> b -> c) -> [a] -> [b] -> [c] и что из map является (a -> b) -> [a] -> [b]Как определить тип функции?

Точно так же, как я могу определить типы функций, таких как zipWith sum?

+1

Вопрос о проверке в ghci или о проверке вручную/в вашем уме? – nponeccop

ответ

5

Вы можете проверить тип в 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.

1

Вы можете увидеть его тип GHCI:

ghci> :t map zipWith 
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]] 

Аналогично для zipWith sum:

ghci> :t zipWith sum 
zipWith sum :: Num (b -> c) => [[b -> c]] -> [b] -> [c] 
+4

Последний тип, вероятно, вызывает хорошую ошибку, как только вы применяете эту вещь :) – Ingo

0

Вот что ghci там для! Или вы можете просто использовать tryhaskell.org

> :t map zipWith 
:: [a -> b -> c] -> [[a] -> [b] -> [c]] 
Смежные вопросы