haskell で line bot を作ってみた

18
LINE Bot 作ってみた ひげ

Upload: nobutada-matsubara

Post on 12-Apr-2017

105 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Haskell で LINE Bot を作ってみた

LINE Bot 作ってみたひげ

Page 2: Haskell で LINE Bot を作ってみた

Abstruct: LINE Bot を作ったScoreBot : CTF のスコアボードを Bot で

メッセージとしてフラグを送信

自分のスコアや問題を出力

SDK: Go 言語

Heroku + PostgreSQL

IBM Bluemix + AWS RDS

フレームワークを意識した設計

を話そうと思ってた

Page 3: Haskell で LINE Bot を作ってみた

しかし

Page 4: Haskell で LINE Bot を作ってみた

普通だ...

Page 5: Haskell で LINE Bot を作ってみた

変態エンジニアが多い(要出典)ドリコムでこんな普通の話をするの

か...

Page 6: Haskell で LINE Bot を作ってみた

そこで

Page 7: Haskell で LINE Bot を作ってみた
Page 8: Haskell で LINE Bot を作ってみた

LINE Bot 作ってみたひげ

Page 9: Haskell で LINE Bot を作ってみた

Haskell でLINE Bot 作ってみた

ひげ

Page 10: Haskell で LINE Bot を作ってみた

Abstruct: LINE Bot を作ったScoreBot : CTF のスコアボードを Bot で

Curry-Howard 同型対応を返す Bot

論文の参照付き!

SDK: Go 言語 Haskell

Heroku + Postgress

IBM Bluemix + AWS RDS

フレームワークを意識した設計

完全にネタ

Page 11: Haskell で LINE Bot を作ってみた

GitHub にmatsubara0507/curry-howard-linebot

Page 12: Haskell で LINE Bot を作ってみた

友達登録

  Curry-Howard Bot    Score Bot (ついで)

Page 13: Haskell で LINE Bot を作ってみた

依存ライブラリ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

Page 14: Haskell で LINE Bot を作ってみた

Demo

Page 15: Haskell で LINE Bot を作ってみた

データベースの代わりに...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") ]

Page 16: Haskell で LINE Bot を作ってみた

Get CorrespondencegetCorrespondence :: Text -> TextgetCorrespondence = fromMaybe "unknown..." . lookupCorrespondence

lookupCorrespondence :: Text -> Maybe TextlookupCorrespondence 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 -> TextappendUrl url = unwords . (: [url])

safeHead :: [a] -> Maybe asafeHead = find (const True)

Page 17: Haskell で LINE Bot を作ってみた

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 ()

Page 18: Haskell で LINE Bot を作ってみた

おしまい