확장 TypeApplications

Posted on June 10, 2020
some :: Num n => n -> n
some x = x + x

> :set -XTypeApplications
> some @Int 1
2
> some @Double 1
2.0

some 함수가 n 컨텍스트에 있는데, n 을 임시로 특정 타입 컨텍스트로 실행하고 싶을 때 @를 붙여, 폴리모픽 함수를 특정 컨텍스트에서 실행할 수 있습니다.

2021.5.8

타입 서명을 명시적으로 써줄 때와 차이를 보입니다.

Prelude> :set -XTypeApplications
Prelude> some x = x + x
Prelude> some @Int 1

<interactive>:5:1: error:
Cannot apply expression of type ‘a0 -> a0’
      to a visible type argument ‘Int
In the expression: some @Int 1
      In an equation for ‘it’: it = some @Int 1

Prelude> :t some
some :: Num a => a -> a
Prelude> :{
Prelude| some :: Num n => n -> n
Prelude| some x = x + x
Prelude| :}
Prelude> some @Int 1
2
Prelude> :t some
some :: Num n => n -> n

Why doesn’t GHCi allow type arguments for this version of join? - stackoverflow 왜!그런지는 모르지만, TypeApplication은 명시적으로 타입 서명을 적어 준 정의에 대해서만 동작한다고 합니다. 관련 이유를 알아내려면 또 논문을 한가득 읽어야 되나 봅니다. 애플리케이션 제작에 필요한 것부터 익히기 위해 이 것 또한 지금은 넘어가야 할 것 같습니다.

Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com