Haskell 结合函子和单子
我是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} 嗯,我认为,这真的很难看(好吧,这里只有字母作为名字
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))
inmaybe::(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
更容易思考。