我正在自学 Haskell,遇到了问题,需要帮助。
背景:
type AInfo = (Char, Int)
type AList = [AInfo] (let’s say [(‘a’, 2), (‘b’,5), (‘a’, 1), (‘w’, 21)]
type BInfo = Char
type BList = [BInfo] (let’s say [‘a’, ‘a’, ‘c’, ‘g’, ‘a’, ‘w’, ‘b’]
一个快速编辑:以上信息仅用于说明目的。列表的实际元素要复杂一些。此外,列表不是静态的;它们是动态的(因此使用 IO monad),我需要在程序运行期间保留/传递/“返回”/有权访问和更改列表。
我希望执行以下操作:
对于 AList 的所有元素,检查 BList 的所有元素,并且在 AList 元素(对)的字符等于 Blist 中的字符的情况下,将 AList 元素(对)的 Int 值加一并从 BList 中删除该字符。
所以这意味着在 AList 的第一个元素与 BList 的所有元素进行检查之后,列表的值应该是:
AList [('a', 5), ('b',5), ('a', 1), ('w', 21)]
BList ['c', 'g', 'w', 'b']
最后,列表值应该是:
AList [('a', 5), ('b',6), ('a', 1), ('w', 22)]
BList ['c', 'g']
当然,所有这些都发生在 IO monad 中。
我尝试过的事情:
使用 mapM 和递归辅助函数。我看过两个:
AList 的每个元素都检查 bList 的每个元素 -- mapM (myHelpF1 alist) blist 和 BList 的每个元素都检查 AList 的每个元素 - mapM (myHelpF2 alist) blist
将两个列表都传递给一个函数并使用复杂的 if/then/else 和辅助函数调用(感觉就像我在强迫 Haskell 进行迭代;混乱的复杂代码,感觉不对。)
我考虑过使用过滤器、AList 元素的字符值和 Blist 来创建第三个 Bool 列表并计算 True 值的数量。更新 Int 值。然后在 BList 上使用 filter 来移除……的 BList 元素(再次感觉不对,不是很像 Haskell。)
我想我知道的关于这个问题的事情:
解决方案可能非常简单。如此之多,更有经验的 Haskeller 会在他们输入回复时低声咕哝“真是个菜鸟”。
任何指针将不胜感激。(喃喃自语……)