一元组合与丢弃 (>>) 翻转



(>>)函数的定义如下:

(>>) :: Monad m => m a -> m b -> m b

但我想实现这个功能翻转如下:

我有一个函数tabulate :: Int -> [Int] -> IO Int,它将列表打印为具有给定列数的表,并返回IOmonad中所有列表项的总和。之后我想要一个显式的putStr "n"

如果我会使用以下内容:

tabulate >> (putStr "n")

它会丢弃制表的结果,反之则不会在表后打印换行符。如果在do:中执行此操作

smth = do
let a = tabulate
putStr "n"
a

由于a是在putStr之后求值的,因此此操作将再次在表之前打印换行符。

如何在制表函数后打印换行符

您可以在此处使用(<*) :: Applicative f => f a -> f b -> f a

smth :: IO Int
smth = tabulate 14 [2, 5]<*putStr "n"

这相当于:

smth = do
a<- tabulate 14 [2, 5]
putStr "n"
returna

因此,它首先评估tabulate 14 [2, 5]IO Int,然后将"n"打印为动作,但它";返回";tabulate调用的值而不是putStr调用的值。

最新更新