我想實作一個函式,它需要一個鍵 k:: Either ab 和一個對串列。我希望鑰匙有兩種形狀。其中一個形狀為左 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
我知道這是初學者水平,我可能完全偏離軌道(或者在我面前有答案),仍然非常感謝任何形式的幫助。
uj5u.com熱心網友回復:
您的bidirectionalLookup函式應該回傳一個型別的值,Maybe (Either a b)但lookupLhs只lookupRhs回傳一個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
uj5u.com熱心網友回復:
首先,您的lookupLhs和lookupRhs函式將不可避免地在不存在的鍵上崩潰,因為它們不是為空串列定義的。您需要添加該案例:
lookupLhs _ [] = Nothing
就bidirectionalLookup,你快到了。您只需要為lookupLhsand提供第二個引數lookupRhs,然后將結果映射Maybe到插入LeftorRight建構式:
bidirectionalLookup (Left x) namesAges = Left <$> lookupLhs x namesAges
bidirectionalLookup (Right x) namesAges = Right <$> lookupRhs x namesAges
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/530197.html
標籤:哈斯克尔
