我正在关注this tutorial并在创建构建表单的函数时出现类型不匹配错误。
我不知道我应该在这里发布什么导入,所以全部:
import Control.Applicative
import Data.Text (Text, unpack)
import qualified Data.Text as T
import qualified Data.ByteString.Lazy as DBL
import Data.Conduit
import Data.Conduit.List (consume)
import Yesod
import Yesod.Static
import Yesod.Form.Bootstrap3
import Data.Time (UTCTime, getCurrentTime)
import Control.Monad.Logger (runStdoutLoggingT)
import Database.Persist
import Database.Persist.Sqlite
import System.FilePath
import System.Directory (removeFile, doesFileExist)
代码:
data Page = Page
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Image
filename Text
description Textarea
date UTCTime
deriving Show
|]
instance Yesod Page where
type Form a = Html -> MForm Handler (FormResult a, Widget)
uploadForm :: Form Image
uploadForm = renderDivs $ Image
<$> fileAFormReq (bfs ("Image" :: Text)) -- error line
<*> areq textareaField (bfs ("Description" :: Text)) Nothing
<*> lift (liftIO getCurrentTime)
无法将
FileInfo
类型与Text
匹配 - 预期类型:AForm处理程序文本
------实际类型:AForm Handler FileInfo ...
我真的不认为,实际上,在GodHub上的Yesod wiki中存在错误,我想这是在我的代码中,但我无法理解。
答案 0 :(得分:4)
我确信自编写示例以来,Yesod API已经发生了变化。
问题是,filename
类型的Image
字段是Filename
,但fileAFormReq
现在返回FileInfo
(docs)。
尝试将Image
的定义更改为:
Image
fileinfo FileInfo
description Textarea
date UTCTime
deriving Show
FileInfo
值具有此结构(docs):
FileInfo
fileName :: !Text
fileContentType :: !Text
fileSourceRaw :: !(Source (ResourceT IO) ByteString)
fileMove :: !(FilePath -> IO ())
因此请使用fileName
访问者获取FileInfo
的文件名。