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


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, k및 p형태 변수입니다. 우리가 보는 것처럼 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.