hsliftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
hsliftM2 (+) [0,1] [0,2] -- [0,2,1,3]
liftM2 (+) (Just 1) Nothing -- Nothing
hsvalid :: Int -> Bool
valid = liftM2 (&&) (0<=) (<=10)
liftM2
の型を具体化するとhsliftM2 :: (Int -> Int -> Bool)
-> ((->) Int) Int
-> ((->) Int) Int
-> ((->) Int) Bool
m
が ((->) Int)
になっているhsvalid n = 0 <= x && x <= 10