2012-07-28 57 views
2

全碼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]' 
+1

對於所有的羽絨選民我不介意你的投票我介意你不要留下你不喜歡的評論。有些人喜歡完整的代碼示例。在我的情況下,短時間提取大部分時間沒有任何意義。 – 2012-07-28 02:02:09

+1

如果您不能在較小的代碼示例中重現該問題,那麼對於認爲自己遇到同樣問題的下一個人有多大幫助?堆棧溢出不僅適用於您,它適用於每個有您的問題的人。如果你無法溝通,你不會對下一個人有太大的幫助。支付它,花時間把你的問題削減到基本要素。另外:鏈接死亡,移動,否則變得破碎。如果你的問題不能獨立存在,那是另一個問題。 – 2012-07-30 02:36:22

+0

下一個可以提取一個簡單的haskell問題的人無論如何都不需要stackoverflow :)下次我將使用stackoverflow聊天。 – 2012-07-30 18:54:12

回答

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函數之一,如fromMaybemaybe。或者,你也可以使用一個明確的case表達:

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

如果您不需要基於fbEmail是否返回NothingJust於呼叫做不同的事情,你可以(也應該)移動這樣的邏輯變成fbEmail本身。

+0

from irc haskell'只要e < - liftIO $ fbEmail $(\(x,y) - >(C.pack x,C.pack y))a''似乎更容易閱讀 – 2012-07-28 01:41:53

+0

您可以添加一個「case」示例請求? – 2012-07-28 01:44:40

相關問題