Обучение чтению 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 на фронт и верните как)
Любая помощь вообще будет оценена по достоинству. Очень хочется читать другие сайты, если кто-то может указать мне на веб-сайт, который поможет вам перевести язык.
Ответы
Ответ 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.