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
Ответ 2
Альтернатива @chi answer liftA3 someFunction a b c
(при необходимости join
).
Ответ 3
Говоря о стрелках...
import Control.Arrow
a' = Kleisli $ const a
b' = Kleisli $ const b
c' = Kleisli $ const c
foo = (`runKleisli`()) $
(a' &&& b') &&& c' >>> uncurry (uncurry someFunction)
Не то, чтобы я рекомендую это.