2012-01-04 9 views
3

私は月と文字列のリストを持っています。月のどれかが文字列に入っているかどうか確認したい。私は単語の文字列を検索する機能も持っています。その関数を書き直さなければならないのでしょうか、それとも何らかの形のマップで可能ですか?私はこのような何かを行うには、これらの機能を利用するにはどうすればよいこのインスタンスでマップを使用する方法は?

fullMons = ["january", "febuary", "march", "april", "may", "june", "july", "september", "october", "november", "december"] 

searchStrList :: String -> [String] -> Bool 
searchStrList str strList = elem (map toLower str) $ convertToLower $ words strList 

check :: String -> Bool 
check str = searchStrList "january" || searchStrList "febuary" || ... 

はまだだけではHaskellを学ぶので、私のコード上の任意の他のコメントが理解されます。ありがとう

答えて

9

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に表示されない")

3

any関数を使用して、リストのどのメンバーでも述語が真であるかどうかを調べることができます。

ここで私は、述語を作るためにData.ListからisInfixOf機能を使用しています

check :: String -> Bool 
check str = any (`isInfixOf` str) fullMons 
0
data Month = January | February | March | April | 
      May | June | July | September | October | November | December 
      deriving (Eq, Show) 

months = [March, December, April] 
april = April `elem` months 

は型を使用し、Aこれらの型から文字列表現への変換は次のようになります。

show April 
+1

'Month'は' Enum'、 'Ord'および' Bounded'も派生します。次に、あなたはすべての月を取得することができます。 'enumFrom January'によって。 – Landei

関連する問題