Haskell 结合函子和单子

Haskell 结合函子和单子,haskell,monads,functor,applicative,maybe,Haskell,Monads,Functor,Applicative,Maybe,我是haskell的新手,不知道如何以表达的方式组合以下功能: f :: A -> B g :: B -> Maybe C h :: C -> Bool 我想要这样一个函数: y :: A -> Bool 目前我是这样做的: y a = case (fmap h ((g.f) a)) of { Just b -> b; Nothing -> False} 嗯,我认为,这真的很难看(好吧,这里只有字母作为名字

我是haskell的新手,不知道如何以表达的方式组合以下功能:

f :: A -> B
g :: B -> Maybe C
h :: C -> Bool
我想要这样一个函数:

y :: A -> Bool
目前我是这样做的:

y a = case (fmap h ((g.f) a)) of {
            Just b -> b;
            Nothing -> False}
嗯,我认为,这真的很难看(好吧,这里只有字母作为名字,但真正的代码也很难看)。我想要的是函数的串联,更具表现力,如:

y a = (h.g.f) a `or` False

如何将一元函数与函子结合起来,是否有类似于
(如Java 8中的
可选#orElse
)的功能

一种方法是使用该函数:

y :: A -> Bool
y a =  maybe False h (g $ f a)
或者正如所指出的,您可以使用无点表示法:

y = maybe False h . (g . f)

要认识到的是,你认为没有什么是虚假的,但哈斯克尔并不认为默认情况下:你需要告诉它

smash :: Maybe Bool -> Bool
smash Nothing = False
smash (Just v) = v

-- or
smash = maybe False id
然后你可以把你的行动和粉碎联系起来

it :: A -> Bool
it = smash . fmap h . g . f

编辑:要清楚,这正是你的代码只是美化了一点

我是否理解正确,在无点风格中,它就像:
maybe(False)(h.(g.f))
in
maybe::(Bool)->(a->Bool->maybe a)->Bool
?@f.Böller:不。看看类型:
maybe False h::maybe C->Bool
g。f::A->可能是C
。这真的是
(可能是假的h)。(g.f)
@Zeta:好了,现在我明白了。你的案例陈述中不需要那么多括号:
案例fmap h。Gf$a的……
。此外,由于它正确缩进,因此也不需要大括号或分号。顺便说一句,这只涉及到
Maybe
Functor
实例,而不是
Monad
。我们只使用了
Functor
fmap
)中的方法,而没有使用
Monad
中的方法。难道
maybe False id
fromaybe False
不一样吗?是的,但是你不必导入
maybe
,而且它更规范,所以我很少使用
fromaybe
。对于我可怜、有限的头脑,
fromx。fmap f
也许x f
更容易思考。