2013-10-10 2 views
1

map zipWith과 같은 기능이 있다고 가정하면 어떻게 그 유형을 결정할 수 있습니까? zipWith의 유형 (a -> b -> c) -> [a] -> [b] -> [c] 것을 감안할 때 map의 내가 zipWith sum 같은 기능의 유형을 결정 어떻게 마찬가지로함수 유형을 어떻게 결정합니까?

(a -> b) -> [a] -> [b]입니까?

+1

ghci를 체크인하는 것에 관한 질문입니까, 아니면 손으로 확인하고 싶은가요? – nponeccop

답변

5

당신은, :t와 GHCi의 유형을 확인할 수 있습니다 사용할 수 있습니다. 자신을 알아 내려고 시도하려면 적절한 유형으로 대체해야합니다. 첫 번째 예제에서, 우리는 map의 첫 번째 인수는 하나 개의 인수의 함수이다

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 

map :: (a -> b) -> [a] -> [b] 

, 그래서 우리는 함수로 zipWith을 생각해야 :

zipWith :: (a -> b -> c) -> ([a] -> [b] -> [c]) 

(위의 유형은 원래의 것과 같습니다. 즉 zipWith은유형의 인수를 사용하는 함수를 변환합니다. ab의 목록을받는 함수에 10 b)

map뿐만 아니라 하나 개의 인수의 함수로 볼 수 있습니다. 이제

map :: (a -> b) -> ([a] -> [b]) 

, 우리는 map 년대의 형식을 기입 결과 유형 - aa -> 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]] 
관련 문제