-- a small exercise:
-- how many words are there in a string
data WordFlag = InWord |
BetweenWords
type ParseState
= (WordFlag
, Int)
countWordsCore
:: String -> ParseState
-> (ParseState
, String)
countWordsCore "" parsestate = (parsestate, "")
countWordsCore string parsestate = countWordsCore stringTail (newFlag, newCount)
where charHead:stringTail = string
(flag, count) = parsestate
isHeadAlpha = isAlpha charHead
newFlag | isHeadAlpha = InWord
newCount | isHeadAlpha && (flag == BetweenWords) = count + 1
countWords string = count
where ((_, count), _) = countWordsCore string (BetweenWords, 0)
main
= do putStrLn "enter a text, complete with Enter" print (countWords string
)
LS0gYSBzbWFsbCBleGVyY2lzZToKLS0gaG93IG1hbnkgd29yZHMgYXJlIHRoZXJlIGluIGEgc3RyaW5nCgppbXBvcnQgQ2hhcgoKY291bnRXb3JkcyA6OiBTdHJpbmcgLT4gSW50CgpkYXRhIFdvcmRGbGFnID0gSW5Xb3JkIHwKICAgICAgICAgICAgICAgIEJldHdlZW5Xb3JkcwogICAgIGRlcml2aW5nIEVxCgp0eXBlIFBhcnNlU3RhdGUgPSAoV29yZEZsYWcsIEludCkKCmNvdW50V29yZHNDb3JlIDo6IFN0cmluZyAtPiBQYXJzZVN0YXRlIC0+IChQYXJzZVN0YXRlLCBTdHJpbmcpCgpjb3VudFdvcmRzQ29yZSAiIiBwYXJzZXN0YXRlID0gKHBhcnNlc3RhdGUsICIiKQoKY291bnRXb3Jkc0NvcmUgc3RyaW5nIHBhcnNlc3RhdGUgPSBjb3VudFdvcmRzQ29yZSBzdHJpbmdUYWlsIChuZXdGbGFnLCBuZXdDb3VudCkKICAgIHdoZXJlIGNoYXJIZWFkOnN0cmluZ1RhaWwgPSBzdHJpbmcKICAgICAgICAgIChmbGFnLCBjb3VudCkgPSBwYXJzZXN0YXRlCiAgICAgICAgICBpc0hlYWRBbHBoYSA9IGlzQWxwaGEgY2hhckhlYWQKICAgICAgICAgIG5ld0ZsYWcgfCBpc0hlYWRBbHBoYSA9IEluV29yZAogICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSAgID0gQmV0d2VlbldvcmRzCiAgICAgICAgICBuZXdDb3VudCB8IGlzSGVhZEFscGhhICYmIChmbGFnID09IEJldHdlZW5Xb3JkcykgPSBjb3VudCArIDEKICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvdW50Cgpjb3VudFdvcmRzIHN0cmluZyA9IGNvdW50CiAgICB3aGVyZSAoKF8sIGNvdW50KSwgXykgPSBjb3VudFdvcmRzQ29yZSBzdHJpbmcgKEJldHdlZW5Xb3JkcywgMCkKCm1haW4gPSBkbyBwdXRTdHJMbiAiZW50ZXIgYSB0ZXh0LCBjb21wbGV0ZSB3aXRoIEVudGVyIgogICAgICAgICAgc3RyaW5nIDwtIGdldExpbmUKICAgICAgICAgIHByaW50IChjb3VudFdvcmRzIHN0cmluZyk=