2014-12-30 3 views
1

В основном я пытаюсь отсканировать строку для слов, содержащих символ, и подсчитать количество найденных слов, имеющих этот символ. Мне просто интересно, есть ли способ проверить, содержит ли слово символ.Haskell эквивалент содержит

код до сих пор выглядит следующим образом:

let w = "Hello i'm kind of new to Haskell, but so far it's great!" 
length $ filter (== 'n') w 

Это становится любое событие на букву п, хотя и если есть 2 п-х в одном слове она подсчитывать бы, что в 2, а не 1, я в основном хочу чтобы проверить, содержит ли слова букву, а затем получить длину.

Благодаря

+0

Посмотрите на https://www.haskell.org/hoogle/ для 'elem', а затем посмотрите' слова'. – AndrewC

+0

@Marcin Ah - Я отредактировал свой комментарий, чтобы быть более ясным, что я имел в виду, извините. Спасибо за разъяснение, bheklilr. – AndrewC

+0

А гениальный, это отличное спасибо, ребята! – Jordan

ответ

8

Вы можете использовать elem:

> 'n' `elem` w 
True 

Для дальнейшего использования в случае, если вы не видели его раньше, есть на самом деле поисковая система, которая будет искать функции в зависимости от типа для Haskell , Если я ищу Char -> String -> Bool или String -> Char -> Bool на hoogle, то elem - это второй результат. Это может быть очень мощный инструмент для обнаружения функций, которые вы не знали.


Чтение ваш вопрос немного ближе и понимая, что именно вы хотите сделать, вы можете комбинировать words, elem и filter довольно легко подсчитать количество слов в строке, которые содержат конкретную букву:

wordsWithLetter :: Char -> String -> Int 
wordsWithLetter c w 
    = length 
    $ filter (c `elem`) 
    $ words w 

Здесь filter (c `elem`) удалит все слова, которые не содержат c так подсчета оставшихся слов с помощью length говорит вам, сколько слов содержится это письмо.

+0

Спасибо за это, я не знал о hoogle. Кроме того, это был, вероятно, мой плохо сформулированный вопрос, но я хотел, чтобы код подсчитывал, что события не возвращают true или false. Может ли это использоваться как фильтр? Таким образом, он будет искать все слова, которые имеют элемент «n», и считать, что – Jordan

+0

@Jordan. Если вы хотите подсчитать вхождения, тогда 'length $ filter (== 'n') w' будет работать нормально. Я бы решил проблему. Однако, если вы хотите подсчитать вхождения всех символов в строке, вам лучше использовать 'Data.Map' и построить значение типа« Map Char Int », когда вы перебираете строку. Это немного сложнее, поэтому, если вы этого хотите, я бы порекомендовал задать отдельный вопрос. – bheklilr

+0

@Jordan Смотрите мои правки после того, как я прочитал ваш вопрос немного ближе к контексту вашего комментария. – bheklilr

Смежные вопросы