определение правильного типа исключений - PullRequest
5 голосов
/ 03 августа 2011

(вопрос новичка. :-))

Предположим, у вас есть последовательность операций (проверки работоспособности во внешнем мире).Если здравомыслие терпит неудачу, нужно кричать.

Однако, Haskell ifs требует, чтобы обе ветви были определены.Случай fail является монадой.Тем не менее, я не уверен, какой правильный тип генерировать в другом случае.Компилятор считает выводимый тип IO a.Однако я не уверен, как создать неоперативный ввод-вывод a.

holler msg test =  
  do
    if not test 
      then
      fail msg
      else
      -- ??? no-op

main :: IO ()
main = do
  holler "Go" True

Ответы [ 2 ]

9 голосов
/ 03 августа 2011

Предполагаемый тип - IO a, потому что fail msg может возвращать что угодно (поскольку на самом деле он никогда не возвращается). Тем не менее, остальная часть на самом деле не должна производить IO a, совершенно нормально превратить ее во что-то более конкретное, то есть IO WhateverYouWant.

В этом случае вас не волнует возвращаемое значение, поэтому вы должны просто использовать IO (), т.е. поставить return () в случае else.

И, как оказалось, в модуле Control.Monad уже есть функция с именем when condition action, которая в точности выполняет if condition then action else return (), так что вы можете просто использовать эту функцию (или ее аналог unless, что сводит на нет сохранение условий). вы not) вместо того, чтобы набирать if.

8 голосов
/ 03 августа 2011

Самое простое это return (). Есть несколько удобных функций, которые выполняют эту часть для вас, а именно when и unless; ваш пример просто holler msg test = unless test (fail msg).

...