2016-07-12 2 views
2

Я пытаюсь реализовать основной slackbot с использованием пакета Network.Linklater:Зачем нужна монада Maybe?

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) -> Application. Должна ли подпись kittensBot выполнить это? Почему не так?

+0

Привет! Я автор пакета. Я сожалею о (когда-либо расширяющемся) разрыве между 4.0 на GitHub и 3.2 в Hackage. Я все еще пытаюсь объединить достаточно хороший API для нового веб-Socket API Slack, но, возможно, я просто продолжу и опубликую его в ближайшее время. – 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. Если вы перейдете на главную страницу Hackage для 'linklater', вы можете изменить версию и перейти к документам для этой версии, чтобы увидеть подписи. Все версии на Hackage прямо сейчас имеют подпись с «Maybe». – crockeea

+0

Но как насчет функциональных органов, а не подписи? –

Смежные вопросы