我有一个像下面这样的模式,可以重复很多次。有没有办法摆脱样板?模式是,我正在检查是否至少有一项[Param]
与特定构造函数匹配。如果存在这样的项目,我将调用具有该值的数据的函数。如果没有,我会通过。
data Param = UserId Int | PostId Int | ...
...
-- in one function:
let matches = [uid | x@(UserId uid) <- xs]
case matches of
[uid'] -> doSomething uid'
_ -> return () -- do nothing
-- in another function:
let matches = [pid | x@(PostId pid) <- xs]
case matches of
[pid'] -> doSomethingElse pid'
_ -> return () -- do nothing
编辑
我不在乎matches
最终是否是一个或多个元素。我只想要第一个元素(如果有)。
如果你只关心的第一要素,那么最好的选择是利用listToMaybe
在Data.Maybe
与沿maybe
功能,你可以这样做:
onSingleton :: Monad m => (a -> m ()) -> [a] -> m ()
onSingleton f = maybe (return ()) f . listToMaybe
那你可以写
onSingleton doSomething [uid | x@(UserId uid) <- xs]
onSingleton doSomethingElse [pid | x@(PostId pid) <- xs]
该listToMaybe
功能是非常简单的。如果传递给它的列表为空,则返回Nothing
,否则返回Just (head list)
。该maybe
函数采用何时Nothing
传入的默认值,以及应用于内部和Just value
传入的函数,因此,将它们一起使用意味着您可以快速将monadic函数应用于列表中的第一个元素,如果该列表不执行任何操作是空的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句