Объединение карты и длины в Хаскеле - PullRequest
0 голосов
/ 25 ноября 2018

У меня две проблемы, связанные с использованием карты и длины. Первая должна вернуть мне количество слов, но вместо этого он считает только элементы в списке.

countWords :: [String]-> Int
countWords xs = length (map (words) xs)

countWords ["asd  qwe", "-- Foo", "", "\thello world "] => 4--instead it have six words

Вторая сложнее, потому чтоон должен вернуть один int для всего списка.Я могу рассчитывать только символы отдельных элементов, а не всего.

countChars :: [String]-> [Int] --it should be Int
countChars xs = map (\w -> length (w)) xs 

countChars ["asd  qwe", "-- Foo", "", "\thello world "] => [8,6,0,13]--it should give back the sum of this list which is 27

1 Ответ

0 голосов
/ 25 ноября 2018

Для второго вам просто нужно позвонить 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)
...