TypeOperators
型演算子を使用可能にするGHC拡張
つまり、型の定義内で演算子を使える
つまり、演算子な型コンストラクタを定義できる
defaultでは(->)が型演算子として定義されている
code:ghci
:t id
id :: a -> a -- 中置演算子として表示されている
:t id :: (->) a a
id :: (->) a a :: a -> a -- 前置としても機能する
例
code:ghci
data a + b = Add a b
:t Add
Add :: a -> b -> a + b
:k (+)
(+) :: * -> * -> *
:k (+) Int -- 部分適用も同様
(+) Int :: * -> *
タプルっぽい配列型を定義する ref
code:hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
data HList xs where
HNil :: HList '[]
(:::) :: a -> HList as -> HList (a ': as)
Servantでの使用例
code:hs
type UserAPI = "users" :> "list" :> Get 'JSON User
Getを受け付ける/users/listというendpointを型レベルで定義している
右結合になる
TypeOperator固有の話でもないmrsekut.icon
kind一般の話
* -> * -> *は、* -> (* -> *)と同じ
参考
https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/type_operators.html
https://qiita.com/CyLomw/items/7e72e98cfe1c8026df2a
https://qiita.com/YoshikuniJujo/items/68af70347e61849ccea9
https://typeclasses.com/ghc/type-operators
型アノテーションの能力も上がっているのかmrsekut.icon
prefixのアノテーションは元からできるが、infixのは拡張によってできるようになる