Bool和List的"类似"功能?

Len*_*low 5 haskell catamorphism

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

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

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

if T.null x then x else foo x
Run Code Online (Sandbox Code Playgroud)

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

Pea*_*ker 6

也许是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
Run Code Online (Sandbox Code Playgroud)

  • [`bool`](http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool)函数存在于`base`包的最新包中. (2认同)

Nei*_*own 4

我想答案可能是不存在这样的通用函数。正如 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
Run Code Online (Sandbox Code Playgroud)

但我不知道标准库中是否有类似的函数(或者任何可以轻松组合在一起的函数)。