monad-lab / study

2 stars 1 forks source link

[CH4](p.54) type constraint 해석 맞는지 확인 부탁드립니다...(_ _) #40

Open PingPingE opened 9 months ago

PingPingE commented 9 months ago

뭐가 타입이고 뭐가 타입 클래스인지 너무 헷갈리는데 위키에 있는 아래 이미지를 보고 이해를 조오금 하기 시작했는데 피드백 부탁드립니닷

위 hierarchy에 따르면...

replicate' :: Int -> a -> [a]
replicate' n x | n <= 0    = [] | otherwise = x : replicate' (n-1) x`

Int는 타입이라 type constraint 없이 바로 선언

replicate'' :: (Num a, Ord a) => a -> b-> [b]
replicate'' n x | n<=0 = [] | otherwise = x : replicate'' (n-1) x

Num과 Ord은 모두 클래스이기 때문에 type constraint에 인스턴스 생성

  • 근데 왜 Num과 Ord이냐? n에 사용하는 연산인 (<=)와 (-)의 타입클래스가 각각 Num, Ord임 (-) :: Num a => a -> a -> a (<=) :: Ord a => a -> a -> Bool
replicate'' :: (Real a) => a -> b -> [b]
replicate'' n x | n<=0 = [] | otherwise = x: replicate'' (n-1) x

Num, Ord 상속받은 Real 가능

replicate'' :: (Integral a) => a -> b -> [b]
replicate'' n x | n<=0 = [] | otherwise = x: replicate'' (n-1) x

Enum, Real 상속받은 Integral 가능

leechanwoo commented 9 months ago

사실 기술하신 정도로 이해해도 아직까지는 큰 무리가 없습니다.

근데 이제 상속이라고 할 때 문제가 typeclass랑 class랑 헷갈리기 시작해서 (typeclass를 메서드를 갖고있는 부모클래스 정도로 해석) 나중에가면 보정이 필요한 부분이 생길 수 있습니다.

그나마 가장 심플하고 비교적 정확한 해석은 typeclass는 행위(메서드)를 가지고 type은 데이터(값)를 가진다고 보면 맞을 것 같습니다.

예를들면 Int의 경우 -1, 0, 1 모두 값이죠. 근데 Int는 그림에서 보면 Ord와 Num을 만족합니다(상속받는다와는 조금 다른 표현) Int는 그 특성상 정렬가능하고 숫자 데이터라는 의미로 볼 수 있습니다

이제 저 의미를 어떻게 Int에게 부여하냐면 int로 할 수 있는 행위, 연산, 메서드로 표현합니다. 정렬 가능하다는 것은 대소비교를 할 수 있다는 것과 같은 의미라서 Ord는 대소비교 연산자를 메서드로 갖는것이고 Int는 그 연산자를 쓸 수 있는 타입입니다.

typeclaas에서 class가 들어갔다고 해서 OOP의 class라고 각인하는 순간 엄청난 혼란이 올 수 있다는것 우선 알려드리고 만약 굳이 비교하신다고 하면

Type -> Class Interface -> Typeclass

로 비교하시는게 차라리 가깝습니다

leechanwoo commented 9 months ago

혹시나 Rust나 Swift, Scala 를 접하신 분이 계시다면 Trait, Protocol의 모티브가 Typeclass라고 보시면 되겠습니다