Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell,创建Html表单的通用方法_Haskell_Generics_Servant - Fatal编程技术网

Haskell,创建Html表单的通用方法

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

我正在用Servant构建一个站点,想知道是否可以创建一个通用实例来生成输入字段

我想要的是有一个

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" }]"
我问这个更一般化的问题的原因是,我不知道如何实现其中的任何一个,无论是简单的还是一般化的,但我希望类似于一般化的东西已经实现了,因为这似乎真的很有用,可以用于实现各种各样的事情,其中字段的名称是相关的,就像任何序列化一样