Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 将标签值作为文本/字符串传递给窗体_Haskell_Yesod - Fatal编程技术网

Haskell 将标签值作为文本/字符串传递给窗体

Haskell 将标签值作为文本/字符串传递给窗体,haskell,yesod,Haskell,Yesod,这是我的问题的后续: 我想从数据库中提取一些信息,并将其作为表单的标签值传递进来。但是,我得到一个类型错误 下面是一个简单的演示(Yesod手册中的shell代码): {-#语言多段类型类} {-#语言重载字符串} {-#语言准语言} {-#语言模板haskell} {-#语言类型族{-} 导入控件。应用程序((),()) 导入数据。文本(Text) 导入数据。时间(天) 进口紫草 导入yessod.Form.Jquery 数据应用程序=应用程序 mkYesod“应用程序”[parseRoute

这是我的问题的后续:

我想从数据库中提取一些信息,并将其作为表单的标签值传递进来。但是,我得到一个类型错误

下面是一个简单的演示(Yesod手册中的shell代码):

{-#语言多段类型类}
{-#语言重载字符串}
{-#语言准语言}
{-#语言模板haskell}
{-#语言类型族{-}
导入控件。应用程序((),())
导入数据。文本(Text)
导入数据。时间(天)
进口紫草
导入yessod.Form.Jquery
数据应用程序=应用程序
mkYesod“应用程序”[parseRoutes]|
/荷马
|]
应用程序实例
实例RenderMessage应用程序FormMessage,其中
renderMessage=defaultFormMessage
实例YesodJquery应用程序
数据人=人
{personName::Text
}
衍生节目
personForm::Text->Html->MForm处理程序(FormResult Person,小部件)
personForm n1=renderDivs$Person
areq textField n1 Nothing——将n1更改为“Name”效果很好。
getHomeR::Handler Html
getHomeR=do

(widget,enctype)让我们看看areq的类型

areq :: (RenderMessage master msg, RenderMessage master FormMessage) => Field sub master a -> FieldSettings msg -> Maybe a -> AForm sub master a
因此,
areq
函数的第二个参数不是
Text
值,而是
FieldSettings msg
。那么,当您在源代码中编写“Name”时,它起作用的原因是什么

在中查找
FieldSettings
的文档时,我们看到它是一个具有
IsString
实例的数据类型。查看中的特定实例 我们看到:

instance (a ~ Text) => IsString (FieldSettings a) where
fromString s = FieldSettings (fromString s) Nothing Nothing Nothing []
因此,每当您在源代码中编写字符串时(如果启用了OverloadedStrings扩展),编译器都会插入fromString实例的内容

但是,您不希望输入字符串,而是希望从
文本
值创建字段设置。进一步查看,我们看到
字段设置的第一部分是
SomeMessage
,检查后,我们看到可以使用
SomeMessage
构造函数创建
SomeMessage

personForm :: Text -> Html -> MForm Handler (FormResult Person, Widget)
personForm n1 = renderDivs $ Person
    <$> areq textField (FieldSettings (SomeMessage n1) Nothing Nothing Nothing []) Nothing
personForm::Text->Html->MForm处理程序(FormResult-Person,小部件)
personForm n1=renderDivs$Person
areq textField(字段设置(SomeMessage n1)Nothing Nothing[])Nothing

让我们看看areq的类型

areq :: (RenderMessage master msg, RenderMessage master FormMessage) => Field sub master a -> FieldSettings msg -> Maybe a -> AForm sub master a
因此,
areq
函数的第二个参数不是
Text
值,而是
FieldSettings msg
。那么,当您在源代码中编写“Name”时,它起作用的原因是什么

在中查找
FieldSettings
的文档时,我们看到它是一个具有
IsString
实例的数据类型。查看中的特定实例 我们看到:

instance (a ~ Text) => IsString (FieldSettings a) where
fromString s = FieldSettings (fromString s) Nothing Nothing Nothing []
因此,每当您在源代码中编写字符串时(如果启用了OverloadedStrings扩展),编译器都会插入fromString实例的内容

但是,您不希望输入字符串,而是希望从
文本
值创建字段设置。进一步查看,我们看到
字段设置的第一部分是
SomeMessage
,检查后,我们看到可以使用
SomeMessage
构造函数创建
SomeMessage

personForm :: Text -> Html -> MForm Handler (FormResult Person, Widget)
personForm n1 = renderDivs $ Person
    <$> areq textField (FieldSettings (SomeMessage n1) Nothing Nothing Nothing []) Nothing
personForm::Text->Html->MForm处理程序(FormResult-Person,小部件)
personForm n1=renderDivs$Person
areq textField(字段设置(SomeMessage n1)Nothing Nothing[])Nothing

感谢@danvari对引用字符串工作原理的清晰解释。我确实尝试了FieldSettings方法,但最初我没有得到足够的参数,我添加了一个空列表。在这之后,我返回了一个类似的错误:无法将预期的类型
SomeMessage site0'与实际类型
Text'匹配。您是正确的,我查看了一个旧版本的Yesod文档。更新了答案。感谢@danvari对引用字符串的工作原理的清晰解释。我确实尝试了FieldSettings方法,但最初我没有得到足够的参数,我添加了一个空列表。在这之后,我返回了一个类似的错误:无法将预期的类型
SomeMessage site0'与实际类型
Text'匹配。您是正确的,我查看了一个旧版本的Yesod文档。更新了答案。