2016-07-12 68 views
2

我試圖實現使用Network.Linklater包一個基本slackbot:爲什麼強制實施Maybe monad?

https://github.com/hlian/linklater

此包定義了以下功能:

slashSimple :: (Command -> IO Text) -> Application 
slashSimple f = 
    slash (\command _ respond -> f command >>= (respond . responseOf status200)) 

我試圖消耗這個像這樣:

kittensBot :: Command -> IO Text 
kittensBot cmd = do 
      putStrLn("+ Incoming command: " ++ show cmd) 
      return "ok" 

main :: IO() 
main = do 
    putStrLn ("Listening on port: " ++ show port) 
    run port (slashSimple kittensBot) 
    where 
     port = 3001 

這產生(在編譯時):

Main.hs:20:28: 
    Couldn't match type ‘Maybe Command’ with ‘Command’ 
    Expected type: Maybe Command -> IO Text 
     Actual type: Command -> IO Text 
    In the first argument of ‘slashSimple’, namely ‘kittensBot’ 
    In the second argument of ‘run’, namely ‘(slashSimple kittensBot)’ 

但是slashSimple的簽名是(Command -> IO Text) -> ApplicationkittensBot的簽名不應該履行嗎?爲什麼不呢?

+0

嗨!我是這個軟件包的作者。對於GitHub 4.0和Hackage 3.2之間的差距(日益擴大)我感到抱歉。我仍然試圖爲新的Web Socket API Slack提供一個足夠好的API,但也許我會盡快發佈它。 – hao

+0

我在這裏上傳了4.0.0.0的新文檔:http://hlian.github.io/linklater/hackage/ – hao

回答

7

雖然slashSimple在GitHub上主的定義是你的報道,Hackage版本linklater-3.2.0.0

slashSimple :: (Maybe Command -> IO Text) -> Application 

如果你想使用Hackage包,你將需要更新kittensBot喜歡的東西:

kittensBot :: Maybe Command -> IO Text 
kittensBot Nothing = ... 
kittensBot (Just cmd) = do 
     putStrLn("+ Incoming command: " ++ show cmd) 
     return "ok" 

或者,您可以從GitHub下載軟件包並手動安裝它。

+0

感謝您的簡要解釋。是否有可能看到給定版本包含哪些代碼? –

+0

以上鍊接精確顯示了版本3.2.0.0中的代碼。如果您訪問linklater的主Hackage頁面,則可以更改版本,然後轉到該版本的文檔以查看簽名。 Hackage上的所有版本現在都有'Maybe'簽名。 – crockeea

+0

但是函數體而不是簽名呢? –