gpt4 book ai didi

list - 避免不完整的模式匹配

转载 作者:行者123 更新时间:2023-12-02 22:02:04 24 4
gpt4 key购买 nike

考虑以下代码:

data A
data B

f :: A -> B
f = undefined

data T = TA A | TB B
data ListT = ListTA [A] | ListTB [B]

g :: [T] -> ListT
g l =
let
f' :: T -> B
f' (TA x) = f x
f' (TB x) = x
isA :: T -> Bool
isA TA{} = True
isA TB{} = False
in
case (all isA l) of
True -> ListTA (map (\(TA x) -> x) l)
False -> ListTB (map f' l)

main = pure ()

这背后的想法是我有一个混合在一起的 AB 列表。我可以转换 A -> B 但反之则不行。基于这个列表,我想创建一个 A 列表或 B 列表,前者如果我的所有原始列表元素都是 A code>s,如果至少有一个是 B,则为后者。

上面的代码可以编译(我猜会起作用),但是 map (\(TA x) -> x) l 中不完整的模式匹配让我有点不舒服。这种不完整的匹配只是我在这里所做的事情的必要条件吗?另外,我是在重新发明轮子吗?有什么可以概括我在这里所做的事情吗?

最佳答案

我能想到的唯一方法是这样的

tryA :: [T] -> Maybe [A]
tryA [] = []
tryA (t:ts) =
case t of
TA x -> do xs <- tryA ts; return (x:xs)
TB _ -> Nothing

如果tryA没有返回任何内容,则像以前一样执行map f' l

这样,您就可以在一次传递中完成 all isA lmap,并且避免了不完整的模式。

关于list - 避免不完整的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44944389/

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