gpt4 book ai didi

haskell - 在 Haskell 中将多个函数合二为一?

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

我想实现一个函数,它接受一个键 k::Either a b,以及一个列表对。我希望按键有两种形状。 Left l 形状之一,它将在对的左半部分执行查找,对右半部分执行查找。两者都应返回列表中第一个匹配对的另一半。如果未找到匹配项,该函数应返回 Nothing。

带有示例列表的输出实例:

namesAges = [("Felix", 45), ("Grace", 25), ("Hans", 57), ("Ivy", 25)]
bidirectionalLookup (Left "Grace") namesAges == Just (Right 25)
bidirectionalLookup (Right 57) namesAges == Just (Left "Hans")

我已经成功地为 lookupRhs 和 lookupLhs 定义了函数,但是我无法将它们组合到我的“bidirectionalLookup”函数中。我使用什么函数形式? ITE、案例、模式匹配?

这是我尝试的一个版本。我有很多修改,但没有给我任何结果。我感觉我走错了路。

namesAges = [("Felix", 45), ("Grace", 25), ("Hans", 57), ("Ivy", 25)]

lookupLhs :: Eq a => a -> [(a, b)] -> Maybe b
lookupLhs x ((l, r) : namesAges) = if x == l then Just r else lookupLhs x namesAges

lookupRhs :: Eq b => b -> [(a, b)] -> Maybe a
lookupRhs x ((l, r) : namesAges) = if x == r then Just l else lookupRhs x namesAges

bidirectionalLookup :: (Eq b, Eq a) => Either a b -> [(a, b)] -> Maybe (Either a b)
bidirectionalLookup (Left x) namesAges = lookupLhs x
bidirectionalLookup (Right x) namesAges = lookupRhs x
bidirectionalLookup _ _ = Nothing

我知道这是初学者水平,我可能完全偏离轨道(或者就此而言,答案就在我眼前),仍然非常感谢任何形式的帮助。

最佳答案

您的bidirectionalLookup 函数应该返回Maybe (Either a b) 类型的值,但是lookupLhslookupRhs 只返回一个 Maybe 类型。

您需要匹配这些函数的返回值,并适本地重新包装结果。

bidirectionalLookup :: (Eq b, Eq a) => Either a b -> [(a, b)] -> Maybe (Either a b)
bidirectionalLookup (Left x) namesAges =
case lookupLhs x namesAges of
Nothing -> Nothing
Just result -> Just (Right result)
bidirectionalLookup (Right x) namesAges =
case lookupRhs x namesAges of
Nothing -> Nothing
Just result -> Just (Left result)

请注意,您的查找函数具有非穷尽模式匹配功能,因为它们从不处理空列表。这很容易通过模式匹配列表为空并返回 Nothing 来解决。对于另一种情况,您可能会发现条件保护是一种比 if/else 更惯用的处理方式。

lookupLhs :: Eq a => a -> [(a, b)] -> Maybe b
lookupLhs _ [] = Nothing
lookupLhs x ((l, r) : namesAges)
| x == l = Just r
| otherwise = lookupLhs x namesAges

关于haskell - 在 Haskell 中将多个函数合二为一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74366841/

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