HasField型クラス
Magic Type Classesによってinstanceが自動生成される
OverloadedRecordFieldsで使用される
RecordDotSyntaxでも使用されるはず(?)
定義
GHC.Recordsに定義されている ref
code:hs
class HasField x r a | x r -> a where
getField :: r -> a
型引数の意味
xは、fieldの名前
rは、Record
aは、Recordにおけるfieldの型
例
このようなHaskellのRecordを定義すると、
code:hs
data User = User
{ name :: Text
, age :: Int
}
Magic Type Classesによって、GHCが自動で以下のようなinstanceを導出する
code:hs
instance HasField "name" User Text where
getField :: User -> Text
getField = name
instance HasField "age" User Int where
getField :: User -> Int
getField = age
これでアクセスできる
code:hs
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds #-}
import GHC.Records (HasField (getField))
getField @"name" (User "hoge" 42) -- "hoge"
getField @"age" (User "hoge" 42) -- 42
#??
Add setField to HasFieldとは
参考
Strategic Deriving :: Kowainik