TLDR: эффектный провал
После этого видео. Возможно, позже я зайду на hackerrank и codechef и решу там несколько вопросов.
И еще одно. Как и Python, Haskell будет шипеть, если отступы неправильные, так что будьте осторожны с этим.
- Создайте функциональный элемент, который возвращает True, если элемент находится в списке, и False, если его нет.
Мое решение
el xs a | xs == [] = False | otherwise = if (head xs) == a then True else el (tail xs) a
Приведенное решение
elem _ [] = False elem e (x:xs) = (e == x) || (elem e xs)
Комментарии: я пишу это так, как будто я пишу функцию на python, базовом регистре и других рекурсивных технологиях. Совсем забыл про сопоставление с образцом. Вероятно, придется привыкнуть к этому.
2. Создайте функцию, удаляющую дубликаты из списка.
Мое решение
-- Problem 2 nub1 xs | xs == [] = [] | otherwise = if elem (head xs) (tail xs) then nub1 tail xs else ...... Tried something like this too nub1 xs = [head xs | x <- xs , el1 (head xs) (tail xs)]
Если вам интересно, что такое «….» значит, это значит, что я посмотрел на решение, потому что понятия не имел, что делать. Я знал, что мне нужно рекурсивно просмотреть список, я просто не знал, как это сделать. Даю решение ниже.
nub2 [] = [] nub2 (x:xs) | elem x xs = nub2 xs | otherwise = x:(nub2 xs)
Я забыл о разочарованиях, связанных с изучением мелочей. Я также предположил, что (x:xs) не является списком (определения функций были даны заранее, и я предположил, что это 2 списка), поэтому я попытался избежать этого. Оказывается, это так. Это тоже нужно иметь в виду.
3. Создайте функцию isAsc, если заданная ей функция находится в порядке возрастания.
Мое решение (не сработало)
-- Problem 3 isAsc [] = True isAsc (x:xs) | x >= (head xs) = isAsc xs | x < (head xs) = False
Фактическое решение
isAsc [] = True isAsc [x] = True isAsc (x:y:xs) = (x <= y) && isAsc (y:xs)
Мне начинают нравиться эти решения хотя бы из-за того, насколько они интуитивно понятны. К сожалению, мне нужно практиковаться в этом.