首页 文章

Bool和List的“类似”功能?

提问于
浏览
5

有时我发现自己编程模式“如果Bool不是假的”或“如果列表不是空的则使用它,否则使用别的东西” .

我正在寻找Bool和List的函数,这些函数对于Maybe来说是“可能”的功能 . 有吗?

更新:我的意思是使用Bool案例作为List-case的一般化 . 例如,当使用Data.Text作为T时:

if T.null x then x else foo x

我希望减少这种锅炉板代码 .

3 回答

  • 6

    我认为答案可能是没有这样的通用功能 . 正如djv所说,你可以在Data.Monoid上构建一个,例如:

    maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
    maybe' repl f x = if x == mempty then repl else f x
    

    但我不知道标准库中的任何函数(或任何可以轻松组合起来的函数) .

  • 3

    也许是Maybe类型的catamorphism .

    foldr是列表类型的同态 .

    如果你曾经使用过像: maybe x (const y)

    你可以使用: foldr (const (const y)) x

    对于Bool我也想念标准库中的catamorphism,但它会是:

    bool :: a -> a -> Bool -> a
    bool t _ True = t
    bool _ f False = f
    
  • 4

    检查Data.Monoid,它是一个类型类,用于描述具有指定空值的数据类型,您可以在其上进行模式匹配以编写通用函数 . Bool 的实例为空值 FalseList 为空值 [] .

相关问题