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

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

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

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여전히, 구체적인 유형이 될 것인가?

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



답변

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


답변

좋은 지적. 저자는 불필요한 가정을합니다. 아마도 그의 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의 의견을 읽으십시오.


답변