在Haskell?中将多个功能合二为一

bxpogfeg  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(156)

我想实现一个函数,它接受一个密钥k::a B,和一个配对列表。我希望键有两个形状。一个形状是Left l,它将在配对的左半部分执行查找,另一个形状是右半部分。这两个形状都将返回列表中第一个匹配配对的另一半。如果没有找到匹配,函数将返回Nothing。
带有示例的输出列表的示例:
第一个
我已经成功地定义了lookupRhs和lookupLhs的函数,但是我无法在我的“bidirectionalLookup”函数中合并它们。我应该使用什么形式的函数?ITE、case-of、模式匹配?
这是我尝试的一个版本。我有很多修改,但都没有给我任何结果。我有一种感觉,我走错了路。

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

我知道,这是初学者的水平,我可能是完全偏离轨道(或有答案的权利在我的鼻子前面为此事),仍然任何形式的帮助将非常感谢。

3bygqnnd

3bygqnnd1#

您的bidirectionalLookup函数应该返回Maybe (Either a b)类型的值,但lookupLhslookupRhs只返回Maybe类型。
您需要匹配这些函数的返回值,并适当地重新 Package 结果。

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
ippsafx7

ippsafx72#

首先,你的lookupLhslookupRhs函数不可避免地会在不存在的键上崩溃,因为它们不是为空列表定义的。

lookupLhs _ [] = Nothing

对于bidirectionalLookup,你几乎已经做到了,你所需要做的只是提供lookupLhslookupRhs的第二个参数,然后Map到得到的Maybe,插入LeftRight构造函数:

bidirectionalLookup (Left x) namesAges = Left <$> lookupLhs x namesAges
bidirectionalLookup (Right x) namesAges = Right <$> lookupRhs x namesAges

相关问题