有时我发现自己在编程模式“如果 Bool 不为假”或“如果列表不为空,则使用它,否则使用其他东西”。
我正在寻找 Bool 和 List 的函数,它们是 Maybe 的“可能”函数。有吗?
更新:我的意思是使用 Bool-case 作为 List-case 的概括。例如,当使用 Data.Text 作为 T 时:
if T.null x then x else foo x
我希望减少这样的样板代码。
有时我发现自己在编程模式“如果 Bool 不为假”或“如果列表不为空,则使用它,否则使用其他东西”。
我正在寻找 Bool 和 List 的函数,它们是 Maybe 的“可能”函数。有吗?
更新:我的意思是使用 Bool-case 作为 List-case 的概括。例如,当使用 Data.Text 作为 T 时:
if T.null x then x else foo x
我希望减少这样的样板代码。
maybe
是 Maybe 类型的 catamorphism。
foldr
是列表类型的变态。
Data.Bool.bool
是 Bool 类型的变质。
如果你曾经使用过maybe
:maybe 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
)
我认为答案可能是没有这样的通用功能。正如 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
但我不知道标准库中有任何类似的函数(或者任何可以轻松组合在一起的函数)。
检查Data.Monoid,它是一个描述具有指定空值的数据类型的类型类,您可以对其进行模式匹配以编写您的通用函数。有 for Bool
with empty valueFalse
和 for List
with empty value的实例[]
。