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