monad-lab / study

2 stars 1 forks source link

[ch7] p.121 타입클래스와 타입에 대한 질문입니다. #51

Open philosucker opened 6 months ago

philosucker commented 6 months ago

vplus :: (Num a) => Vector a -> Vector a -> Vector a (Vector i j k) vplus (Vector l m n) = Vector (i+l) (j+m) (k+n)

저기서 Num a에 관해 찾아본 내용들을 토대로 질문이 생겨 여쭤봅니다.

Num a에서 Num 은 타입 클래스 a는 Int나 Float 등 Num 타입 클래스의 인스턴스로 정의된 것들이 올 수 있게 하는 타입 변수 Num a =>는 a가 Num 타입 클래스의 인스턴스여야 한다는 제약을 나타낸다.

Num 타입 클래스에서 Num 타입 클래스의 특정 타입에 대한 인스턴스들이 수행할 수 있는 연산들과 위 연산들의 실제 구현은 https://hackage.haskell.org/package/base-4.19.1.0/docs/src/GHC.Num.html#Num 여기서 찾았는데요,

다형성이 필요한 경우에 예컨대 Num 타입 클래스를 써서 Num a => 이런식으로 타입 클래스 제약을 걸어 다양한 타입을 받아 연산이 가능하도록 함수에 다형성을 줄 수 있게 되는 게 타입 클래스의 기능 중 하나다.

제가 지금까지 이해한 게 맞다면

특정 타입클래스의 특정 타입에 대한 타입 인스턴스의 정의는 (위의 Num 타입클래스처럼) 각 타입클래스가 정의된 모듈에 있거나 다른 어디에 있거나 할텐데요

이제 첫번째 질문입니다. (맨 아래 두번째 질문도 있습니다) 타입 자체에 대한 정의 예컨대 Int 같은 경우도

같은 Int 타입끼리의 연산을 정의해놓은 곳이 따로 있나요? (있어야 하나요?)

제가 찾은건 아래 둘인데

GHC.Types 모듈의 Int 타입 정의 https://hackage.haskell.org/package/ghc-prim-0.11.0/docs/src/GHC.Types.html#Int

prelude 모듈의 numeric types의 data Int https://hackage.haskell.org/package/base-4.19.1.0/docs/Prelude.html#g:5

아래껀 아닌거 같고 위에 있는 GHC.Types 모듈의 Int 타입 정의가 맞을까요? 근데 저기 기술된걸로 충분한건지, 그렇다면 어떻게 충분해지는 건지 잘 모르겠습니다.

Int 타입을 value를 가지고 있고 어떤 type parameter도 받지 않는다는 의미로서의 concrete type 으로 보는 관점에서 Int 타입을 가지고 직접 연산할 때 예컨대 ghci> 9+3 처럼요

여기서 9가 3과 덧셈이 될 수 있다 (반대로 3이 9와 덧셈이 될 수 있다) 라는 게 가능할 수 있게 int 타입 자체가 무엇이고 얘네가 무엇을 할 수 있는지가 기술된 모듈이 따로 있어서 (i.e. 하스켈은 어떤 이유로 이런걸 따로 자기자신의 언어로 모듈화해놔서)

이게 궁금해진 까닭은 타입클래스라는 게 어떻게 보면 type constructor와는 다른 의미로서의 다양한 타입을 특정 기능을 위해 다룰 수 있는 '틀' 이라고 이해를 했는데

그러면 아주 기본적인 타입들, 위의 예처럼 Int 같은 것들의 경우 이런 기본적인 타입들을 다루기 위한 또 다른 차원의 틀이 있는 건지 궁금해졌습니다. 122p 첫 문단을 보면 a type class is a sort of an interface that defines some behavior, and that a type can be made an instance of a type class if it supports that behavior. 이런 문장이 있는데 "타입이 해당 behavior 를 지원한다면" 이라는 조건문이 있는 걸로 보아 있을 거 같아서요.

두번째 질문입니다 Int 같은 기본적인 data type의 정의가 존재하는 방식이 Int 타입이 필요로 하는 어떤 타입 클래스들의 인스턴스로서만 그 behavior가 정의되는 형태로 존재하면 안되는 걸까요?

110p 에 있는 비유처럼 data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647

Int가 저런 식으로 정의 돼 있다면 (실제로 표현가능한 모든 정수를 모두 열거했다는 점이 아니라 '하스켈 문법'으로 정의 됐다는 점에서)

결국 Int를 정의하는 건 정수라는 숫자 자체 만이 아니라 모든 정수를 열거할 수 있는 어떤 하스켈 함수도 필요하다는 건데 이게 서로 정의가 계속 순환되지 않고 끝나는 지점이 어딘지가 궁금합니다.

질문이 제대로 전달이 됐는지 모르겠습니다ㅠ

leechanwoo commented 6 months ago
  1. 더하기는 누가 정의하는가? Num이 정의합니다. Num에 (+) 메서드가 있고요 Num 타입클래스로 Int 인스턴스를 만들 수 있는데 그게
    instance Num Int where 
    x + y = ..

    입니다

instance 정의할 때 x + y 를 어떻게 구현할 것인지를 같이 명시하게 돼있습니다. 저기서 Int를 어떻게 (+) 시킬 것인가를 구현하면 됩니다.

  1. Int 값은 어떻게 만들어지는가? 진짜 열거형이라도 되는건가? 사실 Int는 primitive type이라고 해서 하스켈에서도 그냥 일반적으로 아는 수체계를 그대로 따라갑니다. 진짜 값이 그렇게 열거돼있는건 아니고 부호비트 + 나머지 표현 비트 이렇게 구성돼있습니다. 그냥 하스켈에서 취급하는 타입과 값을 Int로 비유하면 저렇다는건데 저게 또 그렇게 말이 안되는건 아니긴 해요 ㅎㅎ