haskell - 结合仿函数和单子(monad)

标签 haskell monads functor applicative option-type

我是一个 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/

相关文章:

rust - 提升功能到选项

scala - 应用仿函数如何与并行算法联系起来? (斯卡拉和斯卡拉兹)

function - Haskell 中的函数和仿函数有什么区别?只有定义?

javascript - JavaScript 中的仿函数实现

sockets - Haskell中的套接字编程: putStrLn/hPutStrLn not behaving as expected [duplicate]

haskell - 如何避免编写这种类型的 Haskell 样板代码

haskell - 没有 lambda 表达式如何编写这些?

haskell - 类型级编程在运行时意味着什么?

haskell - Monad Bind 坚持不同的类型?

flutter - 迁移到 Dart null safety : best practice for migrating ternary operator null checks? monadic 方法是否太不合常规?