Bool和List的“类似”功能?

时间:2010-10-01 08:50:26

标签: haskell catamorphism

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

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

更新:我的意思是使用Bool案例作为List-case的概括。例如,当使用Data.Text作为T:

if T.null x then x else foo x

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

3 个答案:

答案 0 :(得分:6)

也许是Maybe类型的变形。

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

答案 1 :(得分: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

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

答案 2 :(得分:3)

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