인스턴스에서 사용했던 유형 클래스 정의에 주어진 유형의 작성 (또는 텍스트 편집기) 정신적보십시오.에서
:
class Print a where
print :: a -> String
및
data A t = A t
우리는, instnace은 우리가 말하고있는 A
에 대한 형식 클래스 정의에 a
을 대체
instance Print A
그래서
을 원하는 우리는 이것을 얻었습니다 :
class Print A where
print :: A -> String
어 - 오. A -> String
은 유형으로 이해가되지 않습니다. 함수 유형 화살표는 왼쪽에 유형을 입력하고 오른쪽에 유형을 취하고 함수 유형을 제공하기 때문입니다. 그러나 A
은 data A t
으로 A
을 선언 했으므로 유형이 아닙니다. A t
은 t
유형의 유형이지만 A
은 유형 생성자입니다. 형식에 적용하면 형식을 만들 수 있지만 A
자체는 다른 형식입니다. 따라서 A t
을 Print
의 인스턴스로 만들 수는 있지만 A
자체는 만들 수 없습니다.
그럼 instance Functor IO
은 왜 작동 했습니까? 클래스 정의를 살펴 봅시다 :
class Functor f where
fmap :: (a -> b) -> f a -> f b
지금 f
에 대한 IO
를 대체하려고 할 수 있습니다 :
class Functor IO where
fmap :: (a -> b) -> IO a -> IO b
IO
의 최종 최대 매개 변수를 입력 적용, 그래서 모두가 밖으로 작동합니다. Int
또는 A t
과 같은 구체적인 유형을 Functor
의 인스턴스로 만들려고하면 문제가 발생합니다.
출처
2012-10-26 04:29:21
Ben