4

完全なコードhttps://github.com/gertcuykens/haskell-design

メイビーテキストタイプからメイビーを持ち上げるにはどうすればよいですか

application :: MVar ServerState -> WS.Request -> WS.WebSockets WS.Hybi10 ()
application state rq = do
    WS.acceptRequest rq
    WS.getVersion >>= liftIO . putStrLn . ("Client version: " ++)
    sink <- WS.getSink
    msg <- WS.receiveData
    clients <- liftIO $ readMVar state
    url <- liftIO fbUrl

    let prefix = "Facebook code"
    let code = T.drop (T.length prefix) msg

    let a = ("code",T.unpack code)
    e <- liftIO $ fbEmail $ (\(x,y) -> (C.pack x, C.pack y)) a

    let client = (e, sink) --ERROR

    case msg of
        _   | not (prefix `T.isPrefixOf` msg) -> do
                WS.sendTextData ("Facebook login " `mappend` url :: Text)
            | any ($ fst client)
                [T.null, T.any isPunctuation, T.any isSpace] ->
                    WS.sendTextData ("Facbook code invalid" :: Text)
            | clientExists client clients ->
                WS.sendTextData ("User already exists" :: Text)
            | otherwise -> do
                liftIO $ modifyMVar_ state $ \s -> do
                    let s' = addClient client s
                    WS.sendSink sink $ WS.textData $
                        "Welcome! Users: " `mappend`
                        T.intercalate ", " (map fst s)
                    broadcast (fst client `mappend` " joined") s'
                    return s'
                talk state client

    Couldn't match expected type `Maybe Text' with actual type `Text'
    Expected type: Maybe Text -> Bool
      Actual type: Text -> Bool
    In the expression: T.null
    In the second argument of `any', namely
      `[T.null, T.any isPunctuation, T.any isSpace]'
4

1 に答える 1

4

関数fbEmailは を返しますMaybe Text。常に であると予想される場合Justは、変数バインディングの左側でパターンを使用して、Textそこからを取得できます。

Just email <- liftIO . fbEmail $ both C.pack a

読みやすさを向上させるために、次のヘルパーを使用します。

both :: (a -> b) -> (a, a) -> (b, b)
both f (x, y) = (f x, f y)

ただし、これはエラーを無視するため、またはData.Maybeなどの関数のいずれかを使用する必要があります。または、明示的な式を使用することもできます。fromMaybemaybecase

maybeEmail <- ...
case maybeEmail of
  Just email -> ...  -- Do something with "email".
  Nothing ->    ...  -- Handle missing emails.

aまたはがfbEmail返されたかどうかに基づいて、呼び出し元でさまざまなことを行う必要がない場合は、このロジックをそれ自体に移動できます (移動する必要があります)。NothingJustfbEmail

于 2012-07-28T01:19:46.067 に答える