IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

明示的に型を指定するVisible Type Application

GHC 8.0からVisible Type Applicationが導入されました。

TypeApplication – GHC

今までは::で型を明示的に指定していました。

Prelude> 
Prelude> let x = return 1
Prelude> :t x
x :: (Num a, Monad m) => m a
Prelude> let x = return 1 :: Maybe Int
Prelude> :t x
x :: Maybe Int
Prelude> let x = return 1 :: Maybe Float
Prelude> :t x
x :: Maybe Float
Prelude> 

TypeApplicationsを使うと@Typeで型を指定することができるようになります。

Prelude> 
Prelude> :set -XTypeApplications
Prelude> let x = return @Maybe 1
Prelude> :t x
x :: Num a => Maybe a
Prelude> 

使い方としては、ポリモーフィックな関数があったとして、それに対して型を限定した使い方をさせたい時に使うのかもしれません。

Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude> :t map @Int @Char
map @Int @Char :: (Int -> Char) -> [Int] -> [Char]