나는 First Principles의 책 Haskell Programming을 읽고 다음 코드 스 니펫을 발견했습니다.
Prelude> fifteen = 15
Prelude> :t fifteen
fifteen :: Num a => a
Prelude> fifteenInt = fifteen :: Int
Prelude> fifteenDouble = fifteen :: Double
Prelude> :t fifteenInt
fifteenInt :: Int
Prelude> :t fifteenDouble
fifteenInt :: Double
여기서 Num 은 OO 언어의 기본 클래스와 같은 유형 클래스입니다. 내가 의미하는 것은 다형성 함수를 작성할 때 Num 유형 클래스에 의해 제한되는 유형 변수 를 취 한다는 것입니다 . 그러나 위에서 본 것처럼 캐스팅 은 또는 작동합니다. OO 언어로 다운 캐스팅하는 것과 같지 않나요?fifteen
Int
Double
그렇게하려면 더 많은 정보 ( Double
이 경우에는 유형별 함수)가 필요하지 않습니까?
도와 주셔서 감사합니다.
아니요, 동일하지 않습니다. OO의 다운 캐스팅은 런타임 작업입니다. 구체적인 유형을 모르는 값이 있고 기본적으로 특정 케이스가 있다고 주장합니다. 실제로 다른 구체적인 유형일 경우 오류입니다.
Haskell에서 ::
실제로는 운영자가 아닙니다. 컴파일 타임에 typechecker 에 추가 정보를 추가합니다 . 즉, 컴파일이 되어도 실제로 런타임에 작동하는지 항상 확신 할 수 있습니다.
그것이 전혀 작동하는 이유 fifteen
는 구체적인 유형 이 없기 때문 입니다. OO 언어 의 템플릿 / 일반 과 같습니다 . 당신이 추가 할 때 그래서 :: Double
제약, 컴파일러는 수 다음 유형이 무엇인지 선택 인스턴스화 를 위해 a
. 그리고 typeclassDouble
의 멤버이기 때문에 괜찮습니다 . 그러나 typeclass를 OO 클래스와 혼동하지 마십시오. OO 클래스는 하나의 구체적인 유형을 지정하지만 하위 유형을 가질 수 있습니다 . Haskell에서는 하위 유형이 존재하지 않으며 클래스는 OO 언어 의 인터페이스 와 비슷합니다 . 또한 같은 typeclass 생각할 수있는 유형의 설정 , 그리고 잠재적으로 모든 유형이있다Num
fifteen
Num
수업; 이들 중 실제로 사용되는 것은 서명으로 선택할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다