背景:
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单子),我需要在程序运行期间保留/传递/“返回”/访问和更改这些列表。
我想要做以下事情: 对于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单子中。
我尝试过的事情:
使用mapM和一个递归的帮助函数。我已经看了两者: 对AList的每个元素检查对BList的每个元素 - mapM(myHelpF1 alist)blist和 对BList的每个元素进行检查,以检查AList - mapM(myHelpF2 alist)blist
将两个列表传递给函数并使用复杂的if / then / else和helper函数调用(感觉就像我强制Haskell成为迭代的一样;混乱的复杂代码,不正确感觉好。)
我考虑使用filter,AList元素和Blist的字符值来创建第三个Bool列表,并计算True值的数量。更新Int值。然后在BList上使用过滤器来删除那些...的BList元素(再次不感觉正确,不太像Haskell)。
我认为我知道有关该问题的事情:
解决方案可能超出了基本。因此,更有经验的Haskellers将在打字时低声自语“什么新手”。任何指针都将不胜感激。(抱怨...)
alist
中显示了重复的条目(对于“'a'”)?这是必要的吗? - Will Ness