종류를 추론 할 때“당신에게 하스켈을 배우십시오”에서 가정은 무엇입니까?


18

이 질문은 주관적이지 않습니다. 매우 구체적인 동사가 참조 된 책에 사용되며, 나는 무언가를 오해하는 것이 두렵기 때문에 그 구절의 의미가 무엇인지 이해하고 싶습니다.

에서 당신에게 하스켈 알아보기 , 다음 단락은 "우리는 가정이 포함 된 세 번째와 마지막입니다 *".

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

그리고 우리는 그것을 인스턴스로 만들고 싶습니다 Functor. Functor종류의 종류를 원 * -> *하지만 Barry그 종류가있는 것처럼 보이지 않습니다. 어떤 종류 Barry입니까? 글쎄, 우리는 세 가지 유형의 매개 변수가 필요하다는 것을 알았습니다 something -> something -> something -> *. 그것이 p콘크리트 유형이므로 일종의 이라고 말하는 것이 안전합니다 *. 를 위해 k, 우리는 *확장에 의해 일종의을 t가지고 있다고 가정* -> * 합니다. 이제 이러한 종류를 something자리 표시 자로 사용한으로 바꾸고 종류가 임을 알 수 있습니다 (* -> *) -> * -> * -> *.

우리는 왜 아무것도 가정하지 않습니까? "우리는 X를 가정합니다 (즉, X가 참이라고 가정합니다)"를 읽을 때 X가 거짓 인 경우도 고려해야한다고 생각하는 것은 당연합니다. 예제의 특정의 경우, 수없는 t종류의 수 (* -> *) -> *k종류의 (* -> *)? 이 경우라면, 무엇이든 t하고 k실제로 있었다, t k여전히, 구체적인 유형이 될 것인가?

나는 추론의 전체 라인이 컴파일러에 대해 검사되는 것을 보았지만 컴파일러 가을 가정한다고 생각하지 않습니다 . 그렇다면, 나는 그것이 무엇인지 알고 싶습니다. 다시하지 않으면 나는 단락의 의미를 놓치고 두려워합니다.


4
당신이 올바른지. 사실, 우리는 할 수 있습니다 k :: L모든 종류 L만큼, t :: L -> *. 그러나 여기서 컴파일러는 특정 L또는 특정 종류를 선택해야합니다 . 다품종이 가장 일반적인 옵션이지만 GHC가 선택합니다 L = *(기본 하스켈에는 다품종이 없으므로 확장으로 설정해야 함). LYAH는 다소 임의적 인 것을 선택하기 때문에 "가정"(AFAICT)이라는 단어를 사용합니다.
chi

1
아마 컴파일러는 아마도 우리가 생각하는 것보다 적거나 퍼즐을 풀지 않았다고 가정 합니다.
Enrico Maria De Angelis '08

답변:


19

실제로 컴파일러는 가정합니다! 그러나 PolyKinds 확장을 사용하지 말라고 요청할 수 있습니다. 자세한 내용은 여기 를 참조 하십시오 . 해당 확장 기능을 켜면 종류는 Barry입니다 forall k. (k -> *) -> k -> * -> *.


-1

좋은 지적. 저자는 불필요한 가정을합니다. 아마도 그의 Type Foo 장에서 이해하기 쉽도록 자신과 같은 사람들이 이것에 대해 의문을 가질 수 있습니다.

모두 t, kp형태 변수입니다. 우리가 보는 것처럼 yabba :: p단독으로 살 수 있기 때문에 마치 상수가 아니라 마치 마치 함수가 아닌 값처럼 마치 형식 서명은 Int또는 Char이름이 무엇이든간에 형식 서명이라고 합니다. 그러나 유형이기 때문에 친절한 서명입니다 *.

그러나 t여기에 입력 형태 변수 소요 k(유형을 구성하기 위해 dabba :: t k) 우리가해야합니다 (더 assumtion 여기)는 것을 그래서 t같은 종류의 서명이 없습니다 * -> *하고 k있다* .

우리가 이것을 알게되면 ... 종류 Barry t k p의 종류의 서명은 (* -> *) -> * -> * -> *걸리는 것을 의미 t한 후 k다음 p우리가 제공 Barry입력합니다.

편집 아래 @luqui의 의견을 읽으십시오.


7
k*추론하는 동안 주장하는 것처럼 제한되지 않습니다 t. 우리는 가질 수 k :: * -> *t :: (* -> *) -> *예를 들어,. doo :: k Int레코드에 필드 를 추가하면 아무런 문제없이 전달됩니다.
luqui

@luqui .. 네 그렇습니다 ... 귀하의 의견이 실제로 가치가 있기 때문에 나는이 답변을 삭제하지 않습니다.
Redu December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.