注fullMons
は機能が、リストではなく、searchStrList
が入力していないこと。 words
は単一の文字列を取りますが、文字列のリストに適用します。
文字列の単語に月の名前が含まれているかどうかを調べることは、fullMons
です。ソリューションを段階的に試してみましょう。まず、入力文字列にwords
を適用します。それは私たちに文字列のリストを取得します。
words str :: [String]
次に、words s
のいずれかの要素が月名であるかどうかを調べる必要があります。機能any
があります:
any :: (a -> Bool) -> [a] -> Bool
だから、私たちのソリューションは、
check str = any ??? (words str)
のようになりますと、私たちがしなければならないすべては???
を把握です。 elem
機能は、私たちは、リスト内の要素かどうかを確認することができます:この場合
elem :: (Eq a) => a -> [a] -> Bool
、リストは、月のリストであるべきであり、我々が探している要素は、文字列の単語でなければなりません。だから、空白を埋めるために:
check :: String -> Bool
check str = any (\word -> word `elem` fullMons) (words str)
(注:foo `op` bar
はちょうどop foo bar
であり、事業者の多くが書かれており、この方法を読まれるように設計されて)
を私たちは、これは、よりシンプルで慣用することができますパラメータを取り除くことで:
check :: String -> Bool
check = any (\word -> word `elem` fullMons) . words
これは、我々が入力するwords
を適用し、words
の結果にany (\word -> elem word fullMons)
を適用することを意味します。あなたはこれをさらに簡素化することができます:
check :: String -> Bool
check = any (`elem` fullMons) . words
(すなわち、「私たちの入力のwords
の要素のいずれかがfullMons
に表示されていますか?「)
が、それは必要ありません。
私はあなたがで取得しようとしていた元の溶液は、順番に、文字列全体の各月の名前を確認することだったと思います。これを行うために、私達はちょうど反転する必要があります制御構造ビット:
check :: String -> Bool
check str = any (\word -> word `elem` ws) fullMons
where ws = words str
(すなわち、 "?fullMons
の要素のいずれかがwords str
に表示されない")
'Month'は' Enum'、 'Ord'および' Bounded'も派生します。次に、あなたはすべての月を取得することができます。 'enumFrom January'によって。 – Landei