アプローチではSum of Products
、レコード機能をどのように取得しますか? レコードのデータ型 ( ) を使用した以下のコード例ghc 7.10.3
:
{-# LANGUAGE DeriveGeneric #-}
import qualified GHC.Generics as GHC
import Generics.SOP
data Rec = Rec { frec :: Int, srec :: Maybe String}
deriving (Show, GHC.Generic)
instance Generic Rec -- empty
instance HasDatatypeInfo Rec
DataTypeInfo
ghci プロンプトで見てみましょう:
*Main> datatypeInfo (Proxy :: Proxy Rec)
ADT "Main" "Rec" (Record "Rec" (FieldInfo "frec" :* (FieldInfo "srec" :* Nil)) :* Nil)
とはどちらもfrec
as文字列を取るコンストラクタを持つ型です。したがって、実際の関数とを取得する方法がわかりません。show exampleも見ましたが、レコード機能は使用していません。srec
FieldInfo
FieldInfo
fieldName
frec :: Rec -> Int
srec :: Rec -> Maybe String
レコード関数を取得する方法についてのポインタを高く評価します (型の HList である可能性がありますHList '[(Rec -> Int), (Rec -> Maybe String)]
))。
質問への補遺
user2407038 がレイアウトしたアプローチを使用して、プロジェクションから関数を取得する方法について、タイプ ノットに縛られています。SOP
したがって、さらに質問に追加したいと思います: コンストラクターのアプローチを使用して、以下のような関数を構築するにはどうすればよいですか?Rec
ここでは、レコード フィールド名と関数の両方を使用します。
[ ("frec" ++) . show . frec, ("srec" ++) . show . srec]