TLDR: эффектный провал

После этого видео. Возможно, позже я зайду на hackerrank и codechef и решу там несколько вопросов.

И еще одно. Как и Python, Haskell будет шипеть, если отступы неправильные, так что будьте осторожны с этим.

  1. Создайте функциональный элемент, который возвращает 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)

Мне начинают нравиться эти решения хотя бы из-за того, насколько они интуитивно понятны. К сожалению, мне нужно практиковаться в этом.