import Data.Foldable (foldMap)
import Data.Monoid (First(First, getFirst))
import Data
.Maybe (fromMaybe
)
data Fruit
= Fruit
{ color
:: String, weight
:: Int }
theFruitIsRed (Fruit "red" _) = Nothing
theFruitIsRed _ = Just "Fruit not red"
theFruitIsNotTooHeavy (Fruit _ w)
| w < 500 = Nothing
checkRules = getFirst . foldMap (First .)
[ theFruitIsRed
, theFruitIsNotTooHeavy
]
main
= mapM (putStrLn . fromMaybe
"No problems!" . checkRules
) [ Fruit "red" 1000
, Fruit "red" 10
, Fruit "blue" 600
, Fruit "blue" 100
]
aW1wb3J0IERhdGEuRm9sZGFibGUgKGZvbGRNYXApCmltcG9ydCBEYXRhLk1vbm9pZCAoRmlyc3QoRmlyc3QsIGdldEZpcnN0KSkKaW1wb3J0IERhdGEuTWF5YmUgKGZyb21NYXliZSkKCmRhdGEgRnJ1aXQgPSBGcnVpdCB7IGNvbG9yIDo6IFN0cmluZywgd2VpZ2h0IDo6IEludCB9Cgp0aGVGcnVpdElzUmVkIDo6IEZydWl0IC0+IE1heWJlIFN0cmluZwp0aGVGcnVpdElzUmVkIChGcnVpdCAicmVkIiBfKSA9IE5vdGhpbmcKdGhlRnJ1aXRJc1JlZCBfICAgICAgICAgICAgICAgPSBKdXN0ICJGcnVpdCBub3QgcmVkIgoKdGhlRnJ1aXRJc05vdFRvb0hlYXZ5IDo6IEZydWl0IC0+IE1heWJlIFN0cmluZwp0aGVGcnVpdElzTm90VG9vSGVhdnkgKEZydWl0IF8gdykKICAgIHwgdyA8IDUwMCAgID0gTm90aGluZwogICAgfCBvdGhlcndpc2UgPSBKdXN0ICJUb28gaGVhdnkiCgpjaGVja1J1bGVzIDo6IEZydWl0IC0+IE1heWJlIFN0cmluZwpjaGVja1J1bGVzID0gZ2V0Rmlyc3QgLiBmb2xkTWFwIChGaXJzdCAuKQogICAgWyB0aGVGcnVpdElzUmVkCiAgICAsIHRoZUZydWl0SXNOb3RUb29IZWF2eQogICAgXQogICAgCm1haW4gPSBtYXBNIChwdXRTdHJMbiAuIGZyb21NYXliZSAiTm8gcHJvYmxlbXMhIiAuIGNoZWNrUnVsZXMpCglbIEZydWl0ICJyZWQiIDEwMDAKCSwgRnJ1aXQgInJlZCIgMTAKCSwgRnJ1aXQgImJsdWUiIDYwMAoJLCBGcnVpdCAiYmx1ZSIgMTAwCgld