Haskell 用`<=<`

Haskell 用`<=<`,haskell,Haskell,我试图理解注意,在 (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c 这里有两个错误 首先,(您不能将单子混合在一起。当您看到签名时 (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c 但事实并非如此,事实上,在一般情况下是不可能的 (<=<) :: (Mona

我试图理解
注意,在

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

这里有两个错误


首先,
(您不能将单子混合在一起。当您看到签名时

(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
但事实并非如此,事实上,在一般情况下是不可能的

(<=<) :: (Monad m1, Monad m2) => (b -> m2 c) -> (a -> m1 b) -> a -> m2 c
f :: Int -> Maybe Int
f 0 = Just 0
f _ = Nothing

g :: Int -> Maybe Int
g x = if even x then Just x else Nothing

h :: Int -> Maybe Int
h = f <=< g
f::Int->Maybe Int
f0=仅为0
f=无
g::Int->Maybe Int
g x=如果偶数x,那么只有x,其他什么都没有
h::Int->Maybe Int
h=f
f :: Int -> [Int]
f x = [x, x^2]

g :: Int -> [String]
g 0 = []
g x = [show x]

λ> :t g <=< f
g <=< f :: Int -> [String]
λ> g <=< f $ 10
["10","100"]
(<=<) :: (b -> Maybe c) -> (a -> Maybe b) -> (a -> Maybe c)
(<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c])
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
(f <=< g) x
f <=< (g x)
maybeToList :: Maybe a -> [a]
maybeToList  Nothing = []
maybeToList (Just a) = [a]
maybeToList . return = return

maybeToList . (f <=< g) = (maybeToList . f) <=< (maybeToList . g)
(maybeToList . f <=< g) x
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
(<=<) :: (Monad m1, Monad m2) => (b -> m2 c) -> (a -> m1 b) -> a -> m2 c
f :: Int -> Maybe Int
f 0 = Just 0
f _ = Nothing

g :: Int -> Maybe Int
g x = if even x then Just x else Nothing

h :: Int -> Maybe Int
h = f <=< g