YesodでFizzBuzzサ一バ一を書く
Yesodを使って何か書きたいなと思ったものの、特に書きたいものがなかったためYesodの学習目的として有名なFizzBuzz問題を解いてくれるAPIサ一バ一を書いてみました。
書いてみた
設計は、GETパラメ一タ一n
を入力としてfizzbuzzの結果をJSON形式で返すようにします。
以下が実際の実装で、下記のコ一ドではValue型のオブジェクトを返すことでレスポンスをJSONにすることができます。 (レスポンス例: {"response":"FizzBuzz"}
)
また、let respMaybe = do ...
の式を見ると値のパ一スに失敗した場合respMaybe
はNothing
となりレスポンスのJSONは{"response":null}
となることがわかります。
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} import Data.Text (Text, pack, unpack) import Text.Read (readMaybe) import Yesod data App = App mkYesod "App" [parseRoutes| / HomeR GET |] instance Yesod App fizzbuzz :: Int -> Text fizzbuzz n | n `mod` 15 == 0 = "FizzBuzz" | n `mod` 5 == 0 = "Buzz" | n `mod` 3 == 0 = "Fizz" | otherwise = pack $ show n getHomeR :: Handler Value getHomeR = do nParam <- lookupGetParam "n" returnJson $ let respMaybe = do n <- nParam n <- readMaybe $ unpack n return . fizzbuzz $ n in object [ "response" .= respMaybe ] main :: IO () main = warp 3000 App
メモ
{-# LANGUAGE OverloadedStrings #-}
Text
をリテラルで表現するために使用。
{-# LANGUAGE TypeFamilies #-}
- 型族を使用可能にする。
- この拡張を無効にすると
mkYesod "App" ...
のところでエラ一になる。
Value
lookupGetParam :: MonadHandler m => Text -> m (Maybe Text)
object :: [Pair] -> Value
name
,value
のペアを要素としてJsonを生成する。(.=)
でPairを作ることができる。- https://hackage.haskell.org/package/yesod-core-1.6.14/docs/Yesod-Core-Json.html#v:object
returnJson :: (Monad m, ToJSON a) => a -> m Value
感想
特に難しい処理をするわけでもないのに{-# LANGUAGE ...
と書き始められるたりして困惑していた。
Template Haskellとかの部分はとりあえずおまじないとしたい気持ちになった。