我想实现一个函数,它接受一个密钥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
我知道,这是初学者的水平,我可能是完全偏离轨道(或有答案的权利在我的鼻子前面为此事),仍然任何形式的帮助将非常感谢。
2条答案
按热度按时间3bygqnnd1#
您的
bidirectionalLookup
函数应该返回Maybe (Either a b)
类型的值,但lookupLhs
和lookupRhs
只返回Maybe
类型。您需要匹配这些函数的返回值,并适当地重新 Package 结果。
请注意,您的查找函数具有非穷举模式匹配的特点,因为它们从不处理空列表。这可以通过模式匹配列表为空并返回
Nothing
来轻松解决。对于另一种情况,您可能会发现条件保护比if/else更习惯于处理这种情况。ippsafx72#
首先,你的
lookupLhs
和lookupRhs
函数不可避免地会在不存在的键上崩溃,因为它们不是为空列表定义的。对于
bidirectionalLookup
,你几乎已经做到了,你所需要做的只是提供lookupLhs
和lookupRhs
的第二个参数,然后Map到得到的Maybe
,插入Left
或Right
构造函数: