Haskell,创建Html表单的通用方法
我正在用Servant构建一个站点,想知道是否可以创建一个通用实例来生成输入字段 我想要的是有一个Haskell,创建Html表单的通用方法,haskell,generics,servant,Haskell,Generics,Servant,我正在用Servant构建一个站点,想知道是否可以创建一个通用实例来生成输入字段 我想要的是有一个 class ToInputField a where toInputField :: a -> InputField 因此,可以使用以下示例实现: instance ToInputField Text where toInputField t = InputField { type = InputText, value = t, name = "some name whic
class ToInputField a where
toInputField :: a -> InputField
因此,可以使用以下示例实现:
instance ToInputField Text where
toInputField t = InputField { type = InputText, value = t, name = "some name which I would like to be derived" }
现在,如果一个类型的每个访问器函数都实现了这个类,我想做一些类似于ToJSON的事情
instance ToJSON Person
但是相反,你应该这样做
class ToForm a where
toForm :: a -> [InputField]
instance ToForm Person
而是像toInputField::Text->a->InputField
,其中Text是访问器字段的名称。因此,toInputField
可以这样实现
instance ToInputField Text where
toInputField n t = InputField { type = InputText, value = t, name = n }
我觉得这在泛型中是可能的,但是我没有创建泛型实现的经验。此外,我认为应该可以为
class NamedFunctor a where
nfmap :: (Text -> b -> c) -> [c]
其中Text是访问器字段的名称。这样我就可以通过简单的
data Person = Person { pname :: Text, pheight :: Int } deriving (Generic, NamedFunctor)
toForm :: NamedFunctor a => a -> [InputField]
toForm = nfmap toInputField
这样我就可以称之为
show . toForm $ User "testName" 172
得到
"[ InputField { type = InputText, value = "testName", name = "pname" }
, InputField { type = InputNumber, value = "172", name = "pheight" }]"
我问这个更一般化的问题的原因是,我不知道如何实现其中的任何一个,无论是简单的还是一般化的,但我希望类似于一般化的东西已经实现了,因为这似乎真的很有用,可以用于实现各种各样的事情,其中字段的名称是相关的,就像任何序列化一样