Итак, я пытаюсь напечатать два значения, прежде чем использовать их. Вот два способа, которые работают отлично, но я чувствую, что есть другие способы, которыми я мог бы это сделать. Я знаю, что предлагаемый способ сделать это, скорее всего, делает блок с момента его изложения и является наименее сложным, но почему бы не увидеть, как еще?Haskell печатает и использует значение из монады
-- 1
main = do
a <- m1
b <- m2
print a
print b
print $ f a b
-- 2
p x = print x >> return x
main = print =<< liftM2 f (p =<< m1) (p =<< m2)
Я также попытался это, но у них есть свои проблемы, я не совсем в состоянии понять, и там никогда не кажется, чтобы быть правильные вещи в цепи вместе.
main = print =<< foldl1 f . mapM p =<< sequence [m1, m2]
main = print =<< on f p m1 m2
main = print . curry (on f) =<< (uncurry (join (***)) p) m1 m2
Я думаю, что on
от Data.Function довольно близко к тому, что я хочу сделать, но я не знаю, как труба в двух монадических значений. Спасибо заранее за любые предложения.
Редактировать: Первый вопрос немного широк: как я могу переписать первый блок? Мой другой вопрос: как я могу извлечь два значения из монады в функцию, которая принимает два значения?
Если бы была функция, которая делала что-то вроде (m a, m a) -> m (a, a)
, то я думаю, что мог бы сделать curry (on f p) =<< thatfunction (m1, m2)
, но может быть и другой способ.
Если это исключительно для целей отладки, то [ 'traceShowId'] (https://hackage.haskell.org/package/base/docs/Debug-Trace.html#v:traceShowId) из' отладки. Trace' может помочь. –
@AlexisKing, если им нужен монадический контекст для чего-то другого, это кажется излишним, но относительным хорошим решением. – dfeuer
В чем вопрос? –