- Создайте файл patterns.hs
В нём сделайте функцию count_nps tokens, которая получает на вход список пар (token, pos) и возвращает число элементов, у которых в поле pos (часть речи) стоит "NP". Например, count_nps [("The", "DT"), ("TreeTagger", "NP"), ("is", "VBZ"), ("easy", "JJ"), ("to", "TO"), ("use", "VB"), (".", "SENT")] == 1
Сделайте похожую функцию count_nouns tokens, которая считает любые существительные, т.е. те случаи, когда pos начинается с N. count_nouns [("Pierre", "NP"), ("Vinken", "NP"), (",", ","), ("61", "CD"), ("years", "NNS")] == 3
Опишите тип данных POSStats, который хранит число прилагательных, существительных и глаголов. Сделайте функцию count_pos tokens, которая получает на вход фрагмент текста после морфологического анализа в виде списка пар (token, pos), и возвращает объект POSStats с результатом подсчётов. Прилагательным мы считаем любой pos-тэг, начинающийся с буквы 'A', существительным – с 'N', глаголом – с 'V'. Например, count_pos [("The", "DT"), ("TreeTagger", "NP"), ("is", "VBZ"), ("easy", "JJ"), ("to", "TO"), ("use", "VB"), (".", "SENT")] == POSStats 0 1 2
- Создайте файл higherorder.hs
Напишите в нём функцию fmin f a b, которая возвращает a, если f a < f b, а в противном случае возвращает b. Например, fmin length "Hello" "world!" == "world!" и fmin id "Hello" "world" == "Hello"
В нём напишите функцию foldl_brackets, которая получает на вход строку, применяет к ней foldl, передав ей функцию, которая на каждом шаге получает очередной символ и накопленный результат (строку), и возвращает строку, в которой очередной символ и накопленные результат склеены вместе и взяты в скобки. Например: foldl_brackets "Hello" == "(((((,'H'),'e'),'l'),'l'),'o')"
Напишите функцию foldr_brackets, которая получает на вход строку, применяет к ней foldr с аргументом, который на каждом шаге оборачивает накопленный результат и текущий символ в пару скобок. (Аналогично предыдущей задаче). foldr_brackets "Hello" == "(H,(e,(l,(l,(o,)))))"
Пользуясь функцией split, которую мы описали в классе, напишите сплиттер, который разбивает текст на предложения, если следом за точкой идёт пробел и заглавная буква. Дабы не мучиться с большими буквами, если вы проимпортируете модуль Data.Char (import Data.Char, обязательно в начале программы), то у вас появятся предикаты isUpper, isLower и куча других прикольных предикатов.