5

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

我正在寻找 Bool 和 List 的函数,它们是 Maybe 的“可能”函数。有吗?

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

if T.null x then x else foo x

我希望减少这样的样板代码。

4

3 回答 3

7

maybe是 Maybe 类型的 catamorphism。

foldr是列表类型的变态。

Data.Bool.bool是 Bool 类型的变质。

如果你曾经使用过maybemaybe x (const y)

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

你的例子if T.null x then x else foo x可以bool写成

bool foo id (T.null x) x

False先取case,反之if

于 2010-10-14T10:35:17.643 回答
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

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

于 2010-10-01T11:30:04.450 回答
3

检查Data.Monoid,它是一个描述具有指定空值的数据类型的类型类,您可以对其进行模式匹配以编写您的通用函数。有 for Boolwith empty valueFalse和 for Listwith empty value的实例[]

于 2010-10-01T09:17:40.573 回答