Подтвердить что ты не робот

Обучение чтению haskell на английском языке

Я исхожу из объектно-ориентированного фона (C, С++, java), поэтому я привык к тому, чтобы читать строку кода на английском языке, чтобы понять, что он делает.

В настоящее время я делаю adendum к тесту, чтобы получить дополнительный кредит. У меня есть пара строк haskell, я не могу понять, как читать, поэтому я не могу понять, что они делают. Я надеюсь, что кто-то может сделать их английскими предложениями.

примером того, что я имею в виду в качестве английского предложения, будет:

i = i + 1

i равно содержимому я + 1.

или

sul ys = all (`elem` ys)

функция sul проверяет все элементы ys для условия, проверяя, что определенный элемент найден в ys, а затем возвращает true или false (по крайней мере, я думаю, что то, что он делает, учитель сказал игнорировать тот факт, что все и elem оба требуют два аргумента.

несколько фрагментов кода, которые я не могу понять, следующие:

twasf p = foldr clip [] where
    clip x xs | p x = x : xs 
              | otherwise = []

(Я не знаю, как перевести "|" )

infixl 5 <*>
xs <*> ys = zipWith ($) xs ys

(я не знаю, как это сказать)

rd []     = []
rd (a:as) = if a `elem` rd as then as else a : rd as

(Я думаю, что это "Создает пустой список rd", а затем проверяет значение "in as", если его найдено, затем возвращает как, в противном случае нажмите a на фронт и верните как)

Любая помощь вообще будет оценена по достоинству. Очень хочется читать другие сайты, если кто-то может указать мне на веб-сайт, который поможет вам перевести язык.

4b9b3361

Ответ 1

Часть первая:

    clip x xs | p x = x : xs 
              | otherwise = []

clip: Если выполняется p (x), верните x: xs, в противном случае верните пустой список.

xs <*> ys = zipWith ($) xs ys

<*> применяет список функций к списку значений.

rd []     = []
rd (a:as) = if a `elem` rd as then as else a : rd as

Слово за слово:

Если список пуст, верните пустой список. В противном случае проверьте, содержится ли первый элемент списка более одного раза, если он удаляет его и возвращает остальную часть списка. Else возвращает первый элемент и применяет функцию, рекурсивную к остальным.

Ответ 2

Haskell является чисто функциональным, поэтому вы не можете сказать "создает, затем проверяет и делает то-то и то-то". Существенные условия применяются лучше.

В последнем примере я думаю, что rd предназначен для удаления дубликатов, поэтому я бы сказал, что удаление дубликатов...

  • пустого списка: пустой список;

  • списка a:as: это остаток as, если a находился в as или a, за которым следует рекурсивное удаление дубликатов в противном случае.

BTW. не должна быть последней строки... if a elem as then rd as else...?

Ответ 3

Посмотрите на них один раз.

  • Синтаксис трубы указывает на охрану, которую вы можете считать похожим на лестницу if-else. Я бы прочитал его как "Если p of x истинно, верните x, сцепленное на xs, в противном случае верните пустой список".

  • В первой строке говорится: "<*> - лево-ассоциативный инфиксный оператор с приоритетом 5" (вам нужно придумать свое произношение для <*> - часто в таких вещах, Просто подумайте об этом как о "op" ). Следующая строка: "xs op ys - это то же самое, что и xs с zs с помощью ys, используя оператор приложения функции $".

  • Это пример функции, имеющей несколько определений. Способ, которым он работает, заключается в том, что если первый "шаблон" аргументов совпадает, это определение используется, а если нет, оно падает до любых других определений. В этом случае я бы прочитал его как "rd пустого списка - это пустой список, иначе (и т.д.)"

Вы, вероятно, извлечете выгоду из чтения через учебник Haskell или два, который поможет вам ознакомиться с синтаксисом и способом мышления о Haskell - например, проверьте http://learnyouahaskell.com/.

Ответ 4

Если вам нужно сделать больше Haskell в будущем, книга Программирование в Haskell - это довольно краткое и приятное введение, которое также говорит вам как правильно читать Haskell. Вот пример из книги:

abs n |n >= 0     = n 
      | otherwise = −n

Символ | читается как "такое, что", и защита иначе определяется в стандартная прелюдия просто в противном случае = True.