在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
并且srec
都是FieldInfo
具有构造函数的类型,该构造函数FieldInfo
采用fieldName
as 字符串。所以,我看不到任何方法来获得实际的功能frec :: Rec -> Int
和srec :: Rec -> Maybe String
. 我还查看了显示示例,但它不使用记录功能。
将欣赏有关如何获取记录函数的指针(可能是 HList 类型HList '[(Rec -> Int), (Rec -> Maybe String)]
))。
问题的附录
我被困在关于如何使用 user2407038 提出的方法从投影中获取功能的类型结中。所以,我想进一步补充这个问题:我们如何使用构造函数的SOP
方法Rec
构建如下函数 - 我们使用记录字段名称以及此处的函数:
[ ("frec" ++) . show . frec, ("srec" ++) . show . srec]