初速1PV

Web系、低レイヤ、プログラミング言語について呟いています

YesodでFizzBuzzサ一バ一を書く

Yesodを使って何か書きたいなと思ったものの、特に書きたいものがなかったためYesodの学習目的として有名なFizzBuzz問題を解いてくれるAPIサ一バ一を書いてみました。

書いてみた

設計は、GETパラメ一タ一nを入力としてfizzbuzzの結果をJSON形式で返すようにします。
以下が実際の実装で、下記のコ一ドではValue型のオブジェクトを返すことでレスポンスをJSONにすることができます。 (レスポンス例: {"response":"FizzBuzz"})
また、let respMaybe = do ...の式を見ると値のパ一スに失敗した場合respMaybeNothingとなりレスポンスの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 ...と書き始められるたりして困惑していた。
Template Haskellとかの部分はとりあえずおまじないとしたい気持ちになった。

参考