yourself Haskell 타입 시그니처의 괄호의 의미는 무엇입니까?




type class haskell (3)

fmap ( Functor 메서드)의 형식 시그니처를 예로 들어 보겠습니다.

(a -> b) -> f a -> f b

이것이 다음과 같은 유형 서명과 어떻게 다른가요?

a -> b -> f a -> f b

이 두 가지 유형의 서명간에 차이점이 있습니까?


예, 차이가 있습니다. 왜냐하면 -> 형식 생성자는 오른쪽 연관 입니다. 다른 말로,

a -> b -> f a -> f b

~에 해당합니다.

a -> (b -> (f a -> f b))

이 형식 시그니처는 a 유형의 매개 변수를 취하여 함수를 반환하는 함수를 나타냅니다. 함수는 b 유형의 매개 변수를 취해 함수 자체를 반환합니다. 함수 자체는 fa 유형의 매개 변수를 사용하고 fb 유형의 값을 반환합니다.

한편,

(a -> b) -> f a -> f b

는 a a -> b 유형의 매개 변수를 취하는 함수를 나타냅니다 (즉, 유형 a 의 매개 변수를 사용 a 유형 b 의 값을 반환하는 함수). 함수 자체는 fa 유형의 매개 변수를 사용하여 값을 반환합니다. fb 입력하십시오.

다음은 두 가지 유형 서명 간의 차이점을 보여주는 인위적인 예제입니다.

f :: (Int -> Bool) -> [Int] -> [Bool]
f = map

g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (\n' -> (n' == n) == b)

λ> let ns = [42, 13, 42, 17]

λ> f (== 42) ns
[True,False,True,False]

λ> g 42 True ns
[True,False,True,False]

λ> g 42 False ns
[False,True,False,True]

예, (a -> b)(a -> b) 갖는 함수 인 하나의 인수를 의미합니다. 반면 a -> b -> ... 는 두 개의 인수를 의미합니다.


예,

(a -> b) -> ...

"a ~ b를 취하는 함수가 주어진다"는 의미입니다. 그러나이

a -> b -> ...

"약간의 A와 B를 받았다"는 의미입니다 ...







parentheses