FileInfo和Text

时间:2015-10-31 02:30:42

标签: haskell yesod

我正在关注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中存在错误,我想这是在我的代码中,但我无法理解。

1 个答案:

答案 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的文件名。