F. *_*ler 4 monads haskell functor applicative maybe
我是一个haskell新手,不知道如何以一种富有表现力的方式结合以下功能:
f :: A -> B
g :: B -> Maybe C
h :: C -> Bool
Run Code Online (Sandbox Code Playgroud)
我想要一个这样的函数:
y :: A -> Bool
Run Code Online (Sandbox Code Playgroud)
目前我这样做:
y a = case (fmap h ((g.f) a)) of {
Just b -> b;
Nothing -> False}
Run Code Online (Sandbox Code Playgroud)
嗯,我认为,这真的很难看(好吧,这里只有字母作为名字,但真正的代码也是丑陋的).我想要的是功能的连接,更具表现力,如:
y a = (h.g.f) a `or` False
Run Code Online (Sandbox Code Playgroud)
如何将monadic函数与仿函数结合起来,是否有类似的东西or(比如Optional#orElseJava 8?)
一种方法是使用Maybe函数:
y :: A -> Bool
y a = maybe False h (g $ f a)
Run Code Online (Sandbox Code Playgroud)
或者正如Zeta指出的那样,您可以使用无点符号:
y = maybe False h . (g . f)
Run Code Online (Sandbox Code Playgroud)
要认识到的是你在考虑什么都不是假的,但是Haskell并没有假设默认情况下:你需要告诉它.
smash :: Maybe Bool -> Bool
smash Nothing = False
smash (Just v) = v
-- or
smash = maybe False id
Run Code Online (Sandbox Code Playgroud)
然后你可以将你的操作与粉碎一起链接起来
it :: A -> Bool
it = smash . fmap h . g . f
Run Code Online (Sandbox Code Playgroud)
编辑:要清楚,这正是你的代码 - 只是美化了一下!