(>>)
函数的定义如下:
(>>) :: Monad m => m a -> m b -> m b
但我想实现这个功能翻转如下:
我有一个函数tabulate :: Int -> [Int] -> IO Int
,它将列表打印为具有给定列数的表,并返回IO
monad中所有列表项的总和。之后我想要一个显式的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
调用的值。