編集:私がやろうとしていることを説明するのは難しいですが、ここに試してみてください(コメントから):
私は wordfeud ソルバーを構築しているので、単語といくつかの文字 (両方の文字リスト) があります。これ ( Haskell で文字列内の文字の頻度を見つけるには? ) を両方のリストに適用して、すべての文字の頻度を取得しました。私が今していることは、「単語」文字リストを繰り返し処理し、すべての文字が「文字」文字リストに十分にあるかどうかを確認することです。
関数を両方のリストの項目に適用し、結果を比較することで、2 つのリストを比較する Haskell 関数を作成しました。
比較は次のように行われます。
hasLetters' :: [Char] -> [Char] -> Bool
hasLetters' word letters = (getCharOccurrence (head word) (getCharOccurrences word)) <= (getCharOccurrence (head word) (getCharOccurrences letters))
これは、単語の最初の文字の出現のみを比較します。ただし、すべての単語を比較する必要があります (結果はすべての単語に対して TRUE になる必要があります)。
これを達成する方法がよくわかりません。述語を定義できる「all」メソッドを見つけました。これは非常に優れています。次のようになります。
all (<= (getCharOccurrence (head word) (getCharOccurrences letters)))
(私はそれが正しいと思います)リストに入るすべてのアイテムが、提供された関数の結果以下であることを確認します。
BUT: 'all' メソッドには別のパラメーターが必要です。これは、述語と比較する対象を定義する「ソース」パラメーターになります。これが単なるリストである場合、これは簡単です。次に、次のようにします。
all (<= (getCharOccurrence (head word) (getCharOccurrences letters))) [0..10]
しかし、問題は次のとおりです。このような結果のリストはありません。次の結果と比較する必要があります。
(getCharOccurrence (head word) (getCharOccurrences letters))
'map' 関数を使用して、'word' char リスト内のすべての文字にこの関数を適用できると考えましたが、その使用方法がわかりません。私はこのように始めました:
map (getCharOccurrence (head word) (getCharOccurrences word)) word
しかし、それは間違っています。
だから私は(私が思うに)必要なもの:上記の関数を「単語」文字リストのすべての文字に適用し、それを述語と比較します。
ただ、考え方が間違っているだけかもしれません。私は完全な Haskell/関数型プログラミングの初心者です。私を助けてください :-)