Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Haskell で LINE Bot を作ってみた

594 views

Published on

ドリコムの勉強会で発表したスライド
Haskell で すごい簡単な LINE Bot を作った話

詳しくは https://matsubara0507.github.io/posts/2017-02-22-curry-howard-linebot.html

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Haskell で LINE Bot を作ってみた

  1. 1. LINE Bot 作ってみた ひげ
  2. 2. Abstruct: LINE Bot を作った ScoreBot : CTF のスコアボードを Bot で メッセージとしてフラグを送信 自分のスコアや問題を出力 SDK: Go 言語 Heroku + PostgreSQL IBM Bluemix + AWS RDS フレームワークを意識した設計 を話そうと思ってた
  3. 3. しかし
  4. 4. 普通だ...
  5. 5. 変態エンジニアが多い(要出典) ドリコムでこんな普通の話をするの か...
  6. 6. そこで
  7. 7. LINE Bot 作ってみた ひげ
  8. 8. Haskell で LINE Bot 作ってみた ひげ
  9. 9. Abstruct: LINE Bot を作った ScoreBot : CTF のスコアボードを Bot で Curry-Howard 同型対応を返す Bot 論文の参照付き! SDK: Go 言語 Haskell Heroku + Postgress IBM Bluemix + AWS RDS フレームワークを意識した設計 完全にネタ
  10. 10. GitHub に matsubara0507/curry-howard-linebot
  11. 11. 友達登録    Curry-Howard Bot    Score Bot (ついで)
  12. 12. 依存ライブラリ Haskell SDK for LINE Messaging API github.com/noraesae/line Haskell Web Application Interface github.com/yesodweb/wai Heroku buildpack for Haskell Stack github.com/mfine/heroku-buildpack-stack
  13. 13. Demo
  14. 14. データベースの代わりに... curryHowardCorrespondence :: [([Text], [Text], URL)] curryHowardCorrespondence = [ ( ["Natural Deducation", "自然演繹"] , ["Typed Lambda Calclus", "型付きラムダ計算"] , "http://disi.unitn.it/.../Papers/curry-howard.pdf") , ( ["Sequent Calculus", "シーケント計算"] , ["Typed Lambda Calclus", "型付きラムダ計算"] , "http://disi.unitn.it/.../Papers/curry-howard.pdf") , ( ["System F"] , ["Polymorphic Lambda Calculus", "2階ラムダ計算"] , "http://disi.unitn.it/.../Papers/curry-howard.pdf") , ( ["Modal Logic", "様相論理"] , ["Mondad", "モナド"] , "http://www.sciencedirect.com/.../S0304397596001697") ]
  15. 15. Get Correspondence getCorrespondence :: Text -> Text getCorrespondence = fromMaybe "unknown..." . lookupCorrespondence lookupCorrespondence :: Text -> Maybe Text lookupCorrespondence txt = msum $ fmap match curryHowardCorrespondence where match (xs, ys, url) | txt `elem` xs = appendUrl url <$> safeHead ys | txt `elem` ys = appendUrl url <$> safeHead xs | otherwise = Nothing appendUrl :: URL -> Text -> Text appendUrl url = unwords . (: [url]) safeHead :: [a] -> Maybe a safeHead = find (const True)
  16. 16. Event Handler サンプルコードの1つ目の echo の引数をかえただけ handleMessageEvent :: ReplyableEvent EventMessage -> IO () handleMessageEvent event = do case getMessage event of TextEM _ (Text text) -> echo (getReplyToken event) (getCorrespondence text) _ -> echo (getReplyToken event) "undefined message" api :: APIIO a -> IO (Either APIError a) api = runAPI getChannelToken echo :: ReplyToken -> T.Text -> IO () echo replyToken content = do api $ reply replyToken [ Message . Text $ content ] return ()
  17. 17. おしまい

×