首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从happs -> happstack转换?

如何从happs -> happstack转换?
EN

Stack Overflow用户
提问于 2016-03-05 00:22:21
回答 1查看 140关注 0票数 4

有人能帮我把下面的代码从happs“翻译”成happstack吗?

代码语言:javascript
复制
module Main where

import HAppS.Server.AlternativeHTTP
import HAppS.Server.HTTP.AltFileServe
import Control.Monad.State
import Numeric

import Contracts

instance FromData ExContr where
  fromData = do c    <- look "contract"
                arg1 <- look "arg1"
                arg2 <- look "arg2"
                img  <- look "image"
                return $ ExContr (c, map fst $ readFloat arg1
                                            ++ readFloat arg2, read img)

main :: IO ()
main = do simpleHTTP [dir "contractEx"
                        [withData $ \(ExContr t) ->
                           [anyRequest $ liftIO $ liftM toResponse =<< renderEx (ExContr t)]
                        ,anyRequest $ ok $ toResponse renderExDefault]
                     ,fileServe ["Contracts.html"] "public" -- fileserving


   ]

Contracts.hs包含:

代码语言:javascript
复制
newtype ExContr = ExContr (String, [Double], Bool) deriving (Read,Show,Eq)

renderEx :: ExContr -> IO Html
 renderEx exSpec@(ExContr (contractId, args, lattice)) =
   let pr = evalEx exSpec
       expValChart = if contractId == "probs" then noHtml -- expected value is meaningless for the probabilities it relies on
                     else h3 << "Expected value" +++ image ! [src (chartUrl $ expectedValuePr pr)]
       imageType = "png"
   in if useLatticeImage exSpec
      then do baseName <- mkUniqueName baseDotFilename
              exitCode <- latticeImage pr (webPath ++ tmpImgPath ++ baseName) imageType
              let pageContents =
                    case exitCode of
                      ExitSuccess -> renderExampleForm exSpec (image ! [src latticeUrl, border 1]) expValChart
                                      where latticeUrl = "/" ++ tmpImgPath ++ baseName ++ "." ++ imageType
                      _ -> p << "renderEx: error generating lattice image"
              return $ renderExamplePage pageContents
      else return $ renderExamplePage $ renderExampleForm exSpec (prToTable pr) expValChart

renderExDefault = renderExamplePage $
                 renderExampleForm (ExContr ("zcb", [fromIntegral t1Horizon, 10], True))
                                   noHtml noHtml

或者,我想了解如何安装与上述代码兼容的旧版本的HappS。不用说,我对Haskell非常陌生。

EN

回答 1

Stack Overflow用户

发布于 2016-03-05 01:34:02

假设您在代码中没有提供的ExContr类型和renderEx函数与我这里提供的类似,那么这应该是可行的。实际上,我不能运行您的代码来确保它的行为相同。

代码语言:javascript
复制
module Main where

import Control.Monad
import Control.Monad.Trans (liftIO)
import Happstack.Server.Internal.Monads (anyRequest)
import Happstack.Server.SimpleHTTP
import Happstack.Server.FileServe
import Numeric

-- data ExContr = ExContr (String, [Double], String)


-- renderEx :: ExContr -> IO String
-- renderEx = undefined

instance FromData ExContr where
  fromData = do c    <- look "contract"
                arg1 <- look "arg1"
                arg2 <- look "arg2"
                img  <- look "image" 
                return $ ExContr (c, map fst $ readFloat arg1
                                            ++ readFloat arg2, read img)

main :: IO ()
main = do
  simpleHTTP (nullConf { port = 80 }) $ msum [
         dir "contractEx" $ withData $ \(ExContr t) -> msum $ [
                anyRequest $ fmap toResponse $ liftIO $ renderEx (ExContr t)
              , anyRequest $ ok $ toResponse renderExDefault
              ]
       , serveDirectory DisableBrowsing ["Contracts.html"] "public"
       ] 

编辑:忘记了renderExDefault行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35800990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档