不能在 monad 中提升多个参数
Can not lift multiple parameters in a monad
您好,我正在尝试执行以下操作:
module MyMonad where
f::(Monad m),=>m (a->b->c)->m a -> m b -> m c
f mf ma mb=
ma >>= \a ->
mb >>= \b ->
mf >>= \c ->
return (c a b)
并像这样使用它:
f (Just 3) (Just 4)
我收到以下错误:
* Non type-variable argument in the constraint: Num (a -> b -> c)
(Use FlexibleContexts to permit this)
* When checking the inferred type
it :: forall a b c.
(Num a, Num (a -> b -> c)) =>
Maybe b -> Maybe c
我不知道如何设置多个类型约束,所以我这样尝试:
f (Just [3]) (Just [4]) (++)
--(知道 (++)
可以应用于任何类型 - 作为 monoid
)。
在这种情况下,我得到以下异常:
* Couldn't match expected type `Maybe b0'
with actual type `[a1] -> [a1] -> [a1]'
* Probable cause: `(++)' is applied to too few arguments
In the third argument of `f', namely `(++)'
In the expression: f (Just [3]) (Left [3]) (++)
In an equation for `it': it = f (Just [3]) (Left [3]) (++)
f
需要一个 monad 包装函数作为 first 参数。在您的第一次尝试中,您根本没有通过该功能;在第二个中,您将 (++)
作为 last 参数传递。
以下工作正常:
> f (Just (++)) (Just [3]) (Just [4])
Just [3,4]
liftM2
(更普遍的是 liftA2
)已经做了一些与您想要的非常相似的事情。
> import Control.Monad (liftM2)
> liftM2 (++) (Just [3]) (Just [4])
Just [3,4]
> import Control.Applicative (liftA2)
> liftA2 (++) (Just [3]) (Just [4])
Just [3,4]
您好,我正在尝试执行以下操作:
module MyMonad where
f::(Monad m),=>m (a->b->c)->m a -> m b -> m c
f mf ma mb=
ma >>= \a ->
mb >>= \b ->
mf >>= \c ->
return (c a b)
并像这样使用它:
f (Just 3) (Just 4)
我收到以下错误:
* Non type-variable argument in the constraint: Num (a -> b -> c)
(Use FlexibleContexts to permit this)
* When checking the inferred type
it :: forall a b c.
(Num a, Num (a -> b -> c)) =>
Maybe b -> Maybe c
我不知道如何设置多个类型约束,所以我这样尝试:
f (Just [3]) (Just [4]) (++)
--(知道 (++)
可以应用于任何类型 - 作为 monoid
)。
在这种情况下,我得到以下异常:
* Couldn't match expected type `Maybe b0'
with actual type `[a1] -> [a1] -> [a1]'
* Probable cause: `(++)' is applied to too few arguments
In the third argument of `f', namely `(++)'
In the expression: f (Just [3]) (Left [3]) (++)
In an equation for `it': it = f (Just [3]) (Left [3]) (++)
f
需要一个 monad 包装函数作为 first 参数。在您的第一次尝试中,您根本没有通过该功能;在第二个中,您将 (++)
作为 last 参数传递。
以下工作正常:
> f (Just (++)) (Just [3]) (Just [4])
Just [3,4]
liftM2
(更普遍的是 liftA2
)已经做了一些与您想要的非常相似的事情。
> import Control.Monad (liftM2)
> liftM2 (++) (Just [3]) (Just [4])
Just [3,4]
> import Control.Applicative (liftA2)
> liftA2 (++) (Just [3]) (Just [4])
Just [3,4]