私は自分自身に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モナドを使用します)、プログラムの実行中にリストにアクセスして変更する必要があります。
私は次のことをしたいと思っています:
AListのすべての要素について、BListのすべての要素と照合し、AList要素(ペア)の文字がBlistの文字と等しい場合、AList要素(ペア)のInt値に1を追加し、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に反復を強制しているように感じます;厄介な複雑なコード、正しくないと感じます)。
フィルタ、AList要素の文字値およびBlistを使用して、Boolの3番目のリストを作成し、True値の数をカウントすることを考えました。Int値を更新します。次に、BListのフィルターを使用して、……(ここでも、Haskellにあまり似ていない、正しく感じられない)BList要素を削除します。
私が問題について知っていると思うこと:
解決策は些細なことを超えている可能性があります。そんなに経験豊富なハスケラーは、彼らが彼らの反応をタイプするとき、彼らの息の下で「なんて初心者」とつぶやくでしょう。
任意のポインタをいただければ幸いです。(つぶやく…。)