您可以使用flip
来反转 的参数take
,这使得可以应用repeat 9
到它并获取函数:
> :t flip take (repeat 9)
flip take (repeat 9) :: Num a => Int -> [a]
要与我们一起使用>>=
,getInt
我们需要Int -> IO a
功能:
> :t (getInt >>=)
(getInt >>=) :: (Int -> IO b) -> IO b
要做到这一点,请组合使用return
(这是m [a]
因为它适用于每个 monad,但也仅限于列表;从上述类型,m
成为IO
和b
成为[a]
):
> :t return . flip take (repeat 9)
return . flip take (repeat 9) :: (Monad m, Num a) => Int -> m [a]
最后的表达式是:
> :t getInt >>= return . flip take (repeat 9)
getInt >>= return . flip take (repeat 9) :: Num a => IO [a]
但是,正如我所提到的,我并不真的相信它比原版更好。作为一种更有用的知识,在 GHCi 中使用表达式及其类型是发明此类转换的好方法。