2012-01-06 6 views
1

数字だけを含むリストで文字列を返したいとします。私はこれを達成するためにfind関数を使用しようとしていますが、述語を作成する際に問題があります。私は私の述語Findで使用するためにこの述部を構築するには?

map and $ (map.map) isDigit ws 

は、文字列のいずれかが数字のみが含まれている場合はTrueで[ブール]を返しますが、使用のために正しく設計されていないことに気づいた

getYear str | hasYear str = fromJust $ find (map and $ (map.map) isDigit ws) ws 
      | otherwise = "0" 
       where ws = words str 

:ここに私がしようとしているものですこの場合には。

答えて

4

便利

all :: (a -> Bool) -> [a] -> Bool 
あなたの関数を記述するために使用することができ

find (all isDigit) 
+0

すべてについて知りませんでした。ありがとうございました – Shane

2

はそれを考え出した:

find (\ws -> and $ map isDigit ws) ws 
+1

使用は 'すべてisDigitもあります'$ map isDigit ws'の代わりに' ws'を使います。 – hammar

+0

'all =と。:map'の理由 –

0

を文字列fromMaybeで年間含まれていないときは、そのケースを扱うことができます。

getYear = fromMaybe "0" . find (all isDigit) . words 
例えば

λ> fromMaybe "0" . find (all isDigit) $ words "sdf" 
"0" 

λ> fromMaybe "" . find (all isDigit) $ words "42139 213 f dsf 2" 
"42139" 

UPD:一方、入力文字列がいくつかの数字を有していてもよいが、hasYearリターンFalse。それで、あなたがケースを処理してはならない理由は、findが返されたときに起こることはないので、Nothingです。

そして、あなたのgetYear月より、そのようになっています

getYear str | hasYear str = fromJust . find (all isDigit) . words $ str 
      | otherwise = "0" 
関連する問題