有时我发现自己编程模式“如果Bool不是假的”或“如果列表不是空的则使用它,否则使用别的东西” .
我正在寻找Bool和List的函数,这些函数对于Maybe来说是“可能”的功能 . 有吗?
更新:我的意思是使用Bool案例作为List-case的一般化 . 例如,当使用Data.Text作为T时:
if T.null x then x else foo x
我希望减少这种锅炉板代码 .
我认为答案可能是没有这样的通用功能 . 正如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
但我不知道标准库中的任何函数(或任何可以轻松组合起来的函数) .
也许是Maybe类型的catamorphism .
foldr是列表类型的同态 .
如果你曾经使用过像: maybe x (const y)
maybe x (const y)
你可以使用: foldr (const (const y)) x
foldr (const (const y)) x
对于Bool我也想念标准库中的catamorphism,但它会是:
bool :: a -> a -> Bool -> a bool t _ True = t bool _ f False = f
检查Data.Monoid,它是一个类型类,用于描述具有指定空值的数据类型,您可以在其上进行模式匹配以编写通用函数 . Bool 的实例为空值 False , List 为空值 [] .
Bool
False
List
[]
3 回答
我认为答案可能是没有这样的通用功能 . 正如djv所说,你可以在Data.Monoid上构建一个,例如:
但我不知道标准库中的任何函数(或任何可以轻松组合起来的函数) .
也许是Maybe类型的catamorphism .
foldr是列表类型的同态 .
如果你曾经使用过像:
maybe x (const y)
你可以使用:
foldr (const (const y)) x
对于Bool我也想念标准库中的catamorphism,但它会是:
检查Data.Monoid,它是一个类型类,用于描述具有指定空值的数据类型,您可以在其上进行模式匹配以编写通用函数 .
Bool
的实例为空值False
,List
为空值[]
.