我是一个 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
如何将一元函数与仿函数结合起来,是否有类似 or
的东西(如 Java 8 中的 Optional#orElse
?)
最佳答案
一种方法是使用 maybe功能:
y :: A -> Bool
y a = maybe False h (g $ f a)
或者如 Zeta指出,您可以使用 pointfree 表示法:
y = maybe False h . (g . f)
关于haskell - 结合仿函数和单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261219/