Haskell версия Idris! -нотация (обозначение помех)

У меня была роскошь узнать немного Идриса в последнее время, и одна вещь, которую я нашел чрезвычайно удобной, это: -notation, которая позволила мне сократить монадический код внутри блока do, например

a' <- a
b' <- b
c' <- c
someFunction a' b' c'

гораздо приятнее

someFunction !a !b !c

Теперь, когда я пишу код в Haskell, я ищу что-то подобное, но, насколько я могу судить, его не существует (и символ привязки, очевидно, уже используется для строгого сопоставления шаблонов). Есть ли способ избежать наличия пустых тривиальных стрелок в блоке do? Возможно, расширение, которое добавляет правило перезаписи или что-то в этом роде?

Ответ 1

Так как каждая монада есть Applicative (с GHC >= 7.10), мы можем написать

someFunction <$> a <*> b <*> c

Обратите внимание, что если someFunction возвращает монадическое значение типа m T, вышесказанное вернет m (m T), что, скорее всего, не то, что мы хотим (как указывает @pigworker ниже). Однако мы можем join объединить два слоя:

join $ someFunction <$> a <*> b <*> c

Ответ 3

Говоря о стрелках...

import Control.Arrow

a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c

foo = (`runKleisli`()) $
  (a' &&& b') &&& c' >>> uncurry (uncurry someFunction)

Не то, чтобы я рекомендую это.