HaskellでTwitterクライアント開発blog(仮)

今すぐに挫折するかもしれない程度のモチベーションによるTwitterクライアント開発記

ユーザ認証・アクセストークン取得

追記)署名アルゴリズムに誤りがあったので訂正

ユーザ認証をどうすべきか悩んだのですが、あんまりいいのが思いつかなかったんで保留。
とりあえず認証用URL表示→PINを手入力でアクセストークン取得まで書いた。

いろいろと型を再考しなきゃならないような気がしていますが、ひとまず思いつくままに書いています。
たとえば以下の関数2つ。

 

-- パラメータのリストから特定のパラメータを取得
getParameter :: Monad m => [Parameter] -> String -> m Parameter
getParameter parameters parameterName =
    case find ( (== parameterName) . fst) parameters of
      Just parameter -> return parameter
      Nothing -> fail "Parameter not found."

なんでモナドにしたのかというとIOモナド内で使いたい&失敗の可能性があるからなんですが、別にモナドである必要がない?
実はエラーを定義(あるいはConnErrorあたりを借用)してFailure型で一般化しようかとも思ったのですが、そこまでする必要があるのか決めかねて結果こんな中途半端な感じに抽象化する結果になりました。
抽象化とかやめてもう完全にIO型にしちゃったほうがすっきりしたかも。

 

-- simpleHTTP のIO版
simpleHTTPIO :: HStream a => Request a -> IO (Response a)
simpleHTTPIO req = do
  res <- simpleHTTP req
  case res of
    Right res' -> return res'
    Left err -> fail.show $ err

simpleHTTPがResult a = Either ConnError a型で返ってきて使いづらかったので、失敗時にはIO例外を投げるIO版simpleHTTP関数を作った。
これはそもそも元のIO (Result (Response a))型がちょっと冗長な感がありますね……IOで包まれてるのにわざわざEither aでエラー通知する必要があんまりない気もします。
どのような事情があってこんな型になっているのでしょう?
(ていうか、これがIOなんだからgetParameterもおとなしくIOにすべきですね……)

一応書いたコードをideoneに置いときます。
表示されたアドレスにアクセスして認証→PINを入力してEnter、でアクセストークンの値を表示します。

http://ideone.com/5EdMg