Для второго вам просто нужно позвонить sum
на результат.
countChars xs = sum (map (\w -> length (w)) xs)
, который также можно переписать как
countChars xs = sum $ map length xs
. Для первого нам нужно вычислить количество слов в каждом элементе и, наконец, суммировать результат.
words
предоставит вам список слов, поэтому после выполнения map (words) xs
(не нужно заключать круглые скобки в слова между прочим), вы получите следующее:
map words ["asd qwe", "-- Foo", "", "\thello world "]
=>
[["asd","qwe"],["--","Foo"],[],["hello","world"]]
Первое, что вы хотите сделать, это получить длину каждого подсписка, которую вы могли бы вписать в свой map
map (\x -> length (words x)) xs
Теперь результат будет:
[2,2,0,2]
И, выполнив сумму для результата, вы получите 6. Таким образом, конечный результат будет
countWords :: [String]-> Int
countWords xs = sum $ map (\x -> length (words x)) xs
С некоторым синтаксическим сахаром вы можете сделать следующее, но я обнаружил, что большинство начинающих смущено этим:
countWords xs = sum $ map (length . words) xs
или даже лучше
countWords = sum . map (length . words)