Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 定义单子运算符_Haskell_Monads - Fatal编程技术网

Haskell 定义单子运算符

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->--等))从不是函数的参数中生成一

在Haskell的Monad中,我可以轻松地将操作符
(>=>)
定义为:

(>=>) :: 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
,原因就更清楚了。