이 질문은 주관적이지 않습니다. 매우 구체적인 동사가 참조 된 책에 사용되며, 나는 무언가를 오해하는 것이 두렵기 때문에 그 구절의 의미가 무엇인지 이해하고 싶습니다.
에서 당신에게 하스켈 알아보기 , 다음 단락은 “우리는 가정이 포함 된 세 번째와 마지막입니다 *
“.
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
, k
및 p
형태 변수입니다. 우리가 보는 것처럼 yabba :: p
단독으로 살 수 있기 때문에 마치 상수가 아니라 마치 마치 함수가 아닌 값처럼 마치 형식 서명은 Int
또는 Char
이름이 무엇이든간에 형식 서명이라고 합니다. 그러나 유형이기 때문에 친절한 서명입니다 *
.
그러나 t
여기에 입력 형태 변수 소요 k
(유형을 구성하기 위해 dabba :: t k
) 우리가해야합니다 (더 assumtion 여기)는 것을 그래서 .t
같은 종류의 서명이 없습니다 * -> *
하고 k
있다*
우리가 이것을 알게되면 … 종류 Barry t k p
의 종류의 서명은 (* -> *) -> * -> * -> *
걸리는 것을 의미 t
한 후 k
다음 p
우리가 제공 Barry
입력합니다.
편집 아래 @luqui의 의견을 읽으십시오.