gpt4 book ai didi

haskell - 如何在存在单个项目的列表理解中减少模式匹配的样板

转载 作者:行者123 更新时间:2023-12-05 01:02:56 25 4
gpt4 key购买 nike

我有一个像下面这样重复很多的模式。有没有办法
摆脱样板?模式是我正在检查是否[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最终成为一个或多个元素。我只想要第一个元素,如果有的话。

最佳答案

如果您只关心第一个元素,那么最好的选择是使用 listToMaybeData.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 函数应用于列表中的第一个元素,或者如果该列表为空则不执行任何操作。

关于haskell - 如何在存在单个项目的列表理解中减少模式匹配的样板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25495251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com