[Этот вопрос мотивирован главой 9 в "Real World Haskell" ]
Здесь простейшая функция (вырезанная по сути):
saferOpenFile path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
return (Just h)
Зачем мне нужен $
?
Если второй аргумент для обработки не является блоком do, мне это не нужно. Следующее работает отлично:
handle (\_ -> putStrLn "Error calculating result") (print x)
Когда я попытался удалить компиляцию $
. Я могу заставить его работать, если я явно добавляю parens, т.е.
saferOpenFile path = handle (\_ -> return Nothing) (do
h <- openFile path ReadMode
return (Just h))
Я могу это понять, но я предполагаю, что, когда Haskell попадает в do
, он должен подумать "Я начинаю блок", и нам не нужно явно помещать $
туда сломать вещи.
Я также думал о том, чтобы нажать блок do на следующую строку, например:
saferOpenFile path = handle (\_ -> return Nothing)
do
h <- openFile path ReadMode
return (Just h)
но это не работает без парнов. Это меня смущает, потому что следующие работы:
add a b = a + b
addSeven b = add 7
b
Я уверен, что просто дойду до точки, где я принимаю это как "это то, как вы пишете идиоматический Haskell", но есть ли у кого есть какая-то перспектива? Спасибо заранее.