Программная память транзакций в Haskell: не удалось сопоставить ожидаемый тип STM a0 с фактическим типом IO ()

У меня есть небольшая программа, которая определяет учетную запись, функцию вывода и пытается выйти из нее. Однако он не компилируется и выдает следующую ошибку:

Couldn't match expected type ‘(STM a0 -> IO a0)
                                    -> STM () -> IO ()’
                  with actual type ‘IO ()’

Похоже, что компилятор не распознает преобразование из STM в IO. Любые указатели были бы замечательными.

import System.IO
import Control.Concurrent.STM

type Account = TVar Int

withdraw :: Account -> Int -> STM ()
withdraw acc amount = do
    bal <- readTVar acc    
    writeTVar acc (bal - amount)

good :: Account -> IO ()
good acc = do
    hPutStr stdout "Withdrawing..."
    {-hi-}atomically{-/hi-} (withdraw acc 10)

main = do
    acc <- atomically (newTVar 200)
    good acc 
    hPutStr stdout "\nDone!\n"

person timothyylim    schedule 02.07.2019    source источник
comment
Можете ли вы опубликовать полную трассировку? (сейчас немного сложно определить, где находится ошибка)   -  person Willem Van Onsem    schedule 02.07.2019
comment
Похоже, что из-за ваших {-hi-}s и т. Д. Вы встроили atomically.   -  person Willem Van Onsem    schedule 02.07.2019


Ответы (1)


Комментарии {-hi-} и {-/hi-} приводят к "отступу" automically, так что в результате вы написали hPutStr stdout "Withdrawing..." atomically (withdraw acc 10). Например, если вы напишете:

good :: Account -> IO ()
good acc = do
        hPutStr stdout "Withdrawing..."
 {-hi-} atomically (withdraw acc 10)

он работает нормально, поскольку "шум" (комментарий {-hi-}) не приводит к встраиванию функции atomically.

Комментарий действительно не имеет семантического эффекта, но вы можете считать его замененным пробелом.

person Willem Van Onsem    schedule 02.07.2019
comment
Вот это да. Я никогда не понимал, что комментарии могут мешать отступам, в основном потому, что довольно редко можно увидеть комментарий перед кодом в той же строке. - person chi; 02.07.2019