2016-04-02 2 views
0

Я очень смущен о Haskell отступа особенно do блок с let и whereHaskell отступы блока «Последнее утверждение в сделай блок должен быть выражением»

я получил следующее сообщение об ошибке на линии action <- «последний оператор do-block должно быть выражением «Как это исправить?

У меня есть следующее определение

type NeovimRead = Neovim r st Text 
type NeovimWrite = Text -> Neovim r st() 

consumeLoop :: Server -> NeovimRead -> NeovimWrite -> Neovim r st() 
consumeLoop server read write = do 
    status <- liftIO $ takeMVar (status server) 
    if status == Running 
     then loop 
     else liftIO $ putMVar (status server) status 
    where loop = do 
    action <- liftIO $ readaction server 
    case action of 
     ReadBuffer -> do 
     text <- read 
     liftIO $ putMVar (buffer server) text 
     WriteBuffer -> do 
     text <- liftIO $ takeMVar (buffer server) 
     write text 
    liftIO $ putMVar (status server) Running 
    consumeLoop server read write 

ответ

2

Тело loop потребностей с отступом больше, чем его название. например:

consumeLoop :: Server -> NeovimRead -> NeovimWrite -> Neovim r st() 
consumeLoop server read write = do 
    status <- liftIO $ takeMVar (status server) 
    if status == Running 
     then loop 
     else liftIO $ putMVar (status server) status 
    where 
    loop = do 
     action <- liftIO $ readaction server 
     ... 
+0

Спасибо. Но есть ли причина, почему это так? – darwinsenior

+0

Поскольку тело блока 'do' не было частью функции, и поэтому было так, как будто у вас был пустой блок' do', поэтому вы получили сообщение об ошибке, которое вы сделали. –