gpt4 book ai didi

list - 倒转 [也许是] 横向行为

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

我想创建一个函数来接收一些要处理的项目,当没有任何项目可以处理时返回 Nothing ,如果至少有一个项目被处理则返回 Just

对我来说,这听起来很像 traverseMaybe 的工作方式,但相反,因为它返回 Nothing 如果至少有一个项目未处理并且 Just 所有项目都已处理。

假设 traverseI 是我的“反向”遍历:

myFunc :: [Int] -> Maybe [Int]
myFunc xs = traverseI (\x -> if x > 5 then Just (x+1) else Nothing) xs

myFunc [1, 3, 6, 9] -- Just [7, 10]
myFunc [1, 2, 3] -- Nothing

我猜我可以 mapMaybe 值并稍后检查它是否至少有一项,但我想知道是否有更“优雅”的解决方案。

编辑:我正在寻找某种方法来获得此功能的等效项:

traverseI :: (a -> Maybe a) -> [a] -> Maybe [a]
traverseI _ [] = Nothing
traverseI f (x:xs) = do
let mh = f x
let mt = traverseI f xs
case mh of
Nothing -> mt
Just h -> case mt of
Nothing -> Just [h]
Just t -> Just (h:t)

最佳答案

因为 Maybe [a] 是一种奇怪的类型,您不太可能找到执行此操作的标准库函数,因此您需要编写自己的...已经完成了。我没有发现您的 traverseI 有任何问题,真的。

如果您想要更简洁的内容,那么以下内容将起作用:

import Data.Maybe

traverseI :: (a -> Maybe a) -> [a] -> Maybe [a]
traverseI f xs = case mapMaybe f xs of
[] -> Nothing
xs -> Just xs

Maybe [a] 是一个“怪异”类型的原因,至少对于这个特定的应用程序来说,是因为更简单的类型 [a] 已经允许一个值,即空列表[],可以表示没有一项可以处理的情况。这种类型已经足够强大,不需要额外的 Maybe 包装器及其关联的 Nothing 值。

关于list - 倒转 [也许是] 横向行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74010292/

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