有时我发现自己编程模式“如果Bool不是假的”或“如果列表不是空的则使用它,否则使用别的东西”。
我正在寻找Bool和List的功能,这些功能对于Maybe来说是“可能”的功能。有没有?
更新:我的意思是使用Bool案例作为List-case的概括。例如,当使用Data.Text作为T:
时if T.null x then x else foo x
我希望减少这种锅炉板代码。
答案 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
空值False
和List
空值[]
的情况。