Haskell 应用'a->;可能是b`函数,也可能是a`

Haskell 应用'a->;可能是b`函数,也可能是a`,haskell,Haskell,假设我有一个函数parse::String->Maybe(Integer,String),它从编码为字符串s的整数列表中解析第一个整数I,如1,2,3,并返回Just(I,s'),其中s'是剩余的字符串,或者Nothing,如果解析失败 然后,如何将此函数简明地应用于可能的字符串parse-maybeString具有冗余类型Maybe(Maybe(Integer,String))并且为此编写自定义模式匹配函数似乎有些过分 更一般地说:是否存在类型为(a->fb)->fa->fb(或者这没有意义?

假设我有一个函数
parse::String->Maybe(Integer,String)
,它从编码为字符串
s
的整数列表中解析第一个整数
I
,如
1,2,3
,并返回
Just(I,s')
,其中
s'
是剩余的字符串,或者
Nothing
,如果解析失败

然后,如何将此函数简明地应用于
可能的字符串
parse-maybeString
具有冗余类型
Maybe(Maybe(Integer,String))
并且为此编写自定义模式匹配函数似乎有些过分

更一般地说:是否存在类型为
(a->fb)->fa->fb
(或者这没有意义?)


编辑:我真傻,我才意识到这是胡说八道。这就是我们需要单子的原因吗?(我还没有到达Haskell的那一部分)。

听起来你在寻找
(>=)
,你可以使用
maybeString>>=parse
。这要求您正在使用的数据类型必须是一个符合要求的Monad。

听起来像是您在寻找
(>=)
,您可以使用它,比如
maybeString>=parse
。这要求您使用的数据类型必须是一个Monad,
可能满足要求。

这是有道理的,所以Monad是应用函数的“超类”,对吧?@Peter!单子比应用函子更一般(在单子中可以做的一切,都可以在应用函子中做)。在GHC的较新版本中,您需要为Monad(
class applicative m=>Monad m,其中
)@ymegdich提供一个应用程序实例。我认为这是一个输入错误,但您的陈述可能会产生误导-Monad实际上没有应用程序那么通用。每个单子都必须是一个应用程序,但不是反之亦然。@RobinZigmond,谢谢!单子比应用函子更专业化。由于某种原因无法编辑注释,认为这是有意义的,所以monad是应用程序函子的“超类”,对吗?@Peter!单子比应用函子更一般(在单子中可以做的一切,都可以在应用函子中做)。在GHC的较新版本中,您需要为Monad(
class applicative m=>Monad m,其中
)@ymegdich提供一个应用程序实例。我认为这是一个输入错误,但您的陈述可能会产生误导-Monad实际上没有应用程序那么通用。每个单子都必须是一个应用程序,但不是反之亦然。@RobinZigmond,谢谢!单子比应用函子更专业化。由于某种原因无法编辑注释是的,这就是Monad的用途。您希望根据参数有条件地运行
parse
函数(如果参数为
Just x
,则运行该函数;如果参数为
Nothing
,则跳过该函数)。根据数据跳过或不跳过(应用程序/一元)函数调用的可能性是使
Monad
applicative
更强大的原因。是的,这就是
Monad
的用途。您希望根据参数有条件地运行
parse
函数(如果参数为
Just x
,则运行该函数;如果参数为
Nothing
,则跳过该函数)。根据数据跳过或不跳过(applicative/monadic)函数调用的可能性使得
Monad
applicative
更强大。