Я узнал о hslogger здесь.
initLogging :: Priority -> IO ()
initLogging level = do
stdOutHandler <- streamHandler stdout level >>= \lh -> return $
setFormatter lh (simpleLogFormatter "[$prio:$loggername:$time] $msg")
updateGlobalLogger rootLoggerName (setLevel level . setHandlers [stdOutHandler])
Я хотел бы создать функцию «quicklog», которая просто требует меньшего набора текста для отладки: если logtype указан как «I», будет использоваться infoM
, а если указано как «D», будет использоваться debugM
и т. д., и по умолчанию INFO
, если уровень ведения журнала не указан.
Я могу сделать версию, которая делает то, что мне нужно:
qLog :: String -> String -> IO ()
qLog l msg = log' "" msg where
log' "I" msg = infoM "" msg
log' "D" msg = debugM "" msg
log' "E" msg = errorM "" msg
log' "W" msg = warningM "" msg
log' _ msg = infoM "" msg
И это работает:
λ> qlog "D" "Thing!"
[DEBUG::2017-01-18 20:38:19 EST] Thing!
λ> qlog "I" "Thing!"
[INFO::2017-01-18 20:38:19 EST] Thing!
Но не могу заставить работать выбор инфоМ, если не указан уровень, а-ля:
λ> qlog "Thing!"
[INFO::2017-01-18 20:38:19 EST] Thing!
Это просто терпит неудачу, ожидая «Вещь!» является необязательным уровнем ведения журнала, а не аргументом msg. Я считаю, что для этого требуется «Может быть», чтобы сообщить, что первый аргумент может вообще не существовать, но, похоже, не может понять его правильно. Вот мои попытки:
qLog2 :: Maybe String -> String -> IO ()
qLog2 l msg = case l msg of
(Just "D") msg -> debugM "" msg
(Just "I") msg -> infoM "" msg
Nothing msg -> infoM "" msg
Or
qLog3 :: Maybe String -> String -> IO ()
qLog3 l msg
| Just "D" msg = debugM "" msg
| Just "I" msg = infoM "" msg
| Nothing msg = infoM "" msg
Кажется, я не могу достаточно сформулировать комбинацию «как может быть» в объявлении типа + либо case
, либо guard
.
ОБНОВЛЕНИЕ 1
qLog4 "D" msg = debugM "" msg
qLog4 "I" msg = infoM "" msg
qLog4 msg = infoM "" msg
Дает мне:
Equations for ‘qLog4’ have different numbers of arguments
ОБНОВЛЕНИЕ 2:
Отказ от дел, пока я выясняю необязательную часть аргумента через здесь
import Data.Optional
newtype LogLevel = LogLevel { getLogLevel :: Char }
qLog' :: Char -> String -> IO ()
qLog' "I" msg = infoM "" msg
qLog' "D" msg = debugM "" msg
qLog' "W" msg = warningM "" msg
qLog' "E" msg = errorM "" msg
qLog' _ msg = infoM "" msg
qLog5 :: (Optional LogLevel) -> String -> IO ()
qLog5 (Specific l) msg = qLog' (getLogLevel l) msg
qLog5 (Default) msg = qLog' "I" msg
<interactive>:251:7-9: error:
• Couldn't match expected type ‘Char’ with actual type ‘[Char]’
• In the pattern: "
l
иmsg
были в кортеже, и шаблон соответствовал этому (толькоcase
ветви на основе one выражения). Тем не менее, почему бы вообще не избавиться отcase
и просто иметь несколько вариантов? - person Alec   schedule 19.01.2017