Haskell 定义单子运算符
在Haskell的Monad中,我可以轻松地将操作符Haskell 定义单子运算符,haskell,monads,Haskell,Monads,在Haskell的Monad中,我可以轻松地将操作符(>=>)定义为: (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c f >=> g = \x -> f x >>= g 我也知道(>>=)可以用(>=>)来表示:我们把(>>=)称为(…): 然而有些事情是不对的。。。有人能指出什么吗?使用一个常量函数(即,\\u->--等))从不是函数的参数中生成一
(>=>)
定义为:
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
f >=> g = \x -> f x >>= g
我也知道(>>=)
可以用(>=>)
来表示:我们把(>>=)
称为(…)
:
然而有些事情是不对的。。。有人能指出什么吗?使用一个常量函数(即,
\\u->--等)
)从不是函数的参数中生成一个函数,这样您就可以将它传递给(>=>)
了。只有两个问题。首先,您使用了错误的参数,因为不是函数的参数是m
:
GHCi> :t \m k -> (\_ -> m) >=> k
\m k -> (\_ -> m) >=> k :: Monad m => m b -> (b -> m c) -> a -> m c
其次,(>=>)
为您提供了一个函数(在上面的演示中类型为a->mc
)。您必须将其应用于某个对象,才能获得与(>>=)
中的一个匹配的结果类型。由于该参数是不相关的(您最终将其馈送给一个常量函数),您可以使用()
:
就这样。我发现使用const
函数比编写\\->
要漂亮一些,因此我将其编写为:
(>>..) :: Monad m => m a -> (a -> m b) -> m b
m >>.. k = (const m >=> k) ()
使用常量函数(即,
\\\->--etc.
)从不是函数的参数生成函数,以便将其传递给(>=>)
的想法是正确的。只有两个问题。首先,您使用了错误的参数,因为不是函数的参数是m
:
GHCi> :t \m k -> (\_ -> m) >=> k
\m k -> (\_ -> m) >=> k :: Monad m => m b -> (b -> m c) -> a -> m c
其次,(>=>)
为您提供了一个函数(在上面的演示中类型为a->mc
)。您必须将其应用于某个对象,才能获得与(>>=)
中的一个匹配的结果类型。由于该参数是不相关的(您最终将其馈送给一个常量函数),您可以使用()
:
就这样。我发现使用const
函数比编写\\->
要漂亮一些,因此我将其编写为:
(>>..) :: Monad m => m a -> (a -> m b) -> m b
m >>.. k = (const m >=> k) ()
解决方案如下:
(..) :: Monad m => m a -> (a -> m b) -> m b
m .. k =
(const m >=> k) undefined
使用
const
我们将ma
类型的操作提升到whatever->ma
。这个提升版根本不在乎我们传递给它的内容,因此它可能是未定义的
解决方案如下:
(..) :: Monad m => m a -> (a -> m b) -> m b
m .. k =
(const m >=> k) undefined
使用
const
我们将ma
类型的操作提升到whatever->ma
。这个升级版一点也不在乎,我们传递给它的可能是未定义的
,这可能只是一个复制粘贴错误,但是您使用了(>=>)
签名作为(>>=)
@duplode,这不是正确的吗?我正在为(>>=)
创建一个别名作为(..)
,因此我想应用(>=>)
操作符来定义(..)
。。。有意义吗?有意义;这只是因为(>>=)
的类型是Monad m=>ma->(a->mb)->mb
,而在你的问题中你写了(..)::Monad m=>(a->mb)->(b->mc)->(a->mc)->(a->mc c)
。你还有一个没有人提到的额外问题:你无法定义(..)操作符,因为。
是保留语法,在范围表示法中使用。@rjanJohansen您可以将其称为foobar
运算符,这可能只是一个复制粘贴错误,但您使用了(>=>)
签名作为(>>=)
@duplode,这不是正确的做法吗?我正在为(>>=)
创建一个别名作为(..)
,因此我想应用(>=>)
操作符来定义(..)
。。。有意义吗?有意义;这只是因为(>>=)
的类型是Monad m=>ma->(a->mb)->mb
,而在你的问题中你写了(..)::Monad m=>(a->mb)->(b->mc)->(a->mc)->(a->mc c)
。你还有一个没有人提到的额外问题:你无法定义(..)操作符,因为。
是保留语法,在范围表示法中使用。@rjanJohansen您可以将其称为foobar
运算符,或者换一种说法:它也可以是未定义的。duplode对()
的选择似乎非常合理。事实上,()
有着特殊的意义,因为(>)()
可以被理解为“点”。我可以用另一种方式来解释:所以它可能不是未定义的。duplode对()
的选择似乎非常合理。事实上,()
具有特殊意义,因为(>)()
可以理解为“点”。我认为()
的选择特别合适,用\()->m
替换常量m
可以更清楚地说明原因。我认为()
的选择特别合适,用\()->m
替换const m
,原因就更清楚了。