Чому функціональний синтаксис мови не наближений до людської мови?


14

Я зацікавився функціональним програмуванням і вирішив поговорити з Haskell. У мене болить голова ... але я врешті-решт отримаю це ... Хоч у мене є одна цікавість, чому синтаксис настільки виразний (за браком іншого слова)?

Чи є причина, чому вона не більш виразна , ближча до людської мови?

Я розумію, що FP добре моделює математичні поняття, і вона запозичила деякі його стислі засоби вираження, але все ж це не математика ... це мова.


4
@ratchet freak: :) Так чи є такий, який створив хлопець, який ненавидить польські позначення?
JohnDoDo

10
@ratchetfreak Яким чином синтаксис Haskell нагадує польські позначення? Оператори Haskell мають виправлення, як і більшість операторів інших мов (а виклики функцій є префіксом - також як і більшість інших функцій інших мов).
sepp2k

10
Це досить велике припущення / стрибок, який ви робите, що "ближче до людської мови" прирівнюється до "більш виразного".
Метт Бал

7
Коли-небудь чули про Кобола та Фортран?
ott--

7
Точно з тієї ж причини, що математики замінили довгі латинські фрази алгебраїчними виразами. З невеликою практикою, більш компактні позначення є набагато продуктивнішими.
Кевін Клайн

Відповіді:


14

Функціональні мови, такі як Хаскелл і його попередник Міранда, виросли з математичної концепції обчислення лямбда . На сторінці Вікіпедії:

Обчислення лямбда (також записується як λ-числення або називається "обчислення лямбда") - це формальна система математичної логіки для вираження обчислень шляхом змінного зв'язування та підстановки.

...

Обчислення лямбда відіграло важливу роль у розвитку теорії мов програмування. Найвідомішими аналогами обчислення лямбда в інформатиці є функціональні мови програмування, які по суті реалізують обчислення (доповнені деякими константами і типами даних). Крім мов програмування, обчислення лямбда також має багато застосувань у теорії доказів. Основним прикладом цього є листування Кері-Говарда, яке дає відповідність між різними системами набраного лямбда-числення та системами формальної логіки.

Через цю історію на синтаксиси цих функціональних мов (та функціональних елементів більш імперативних мов) сильно впливає математичне позначення, яке використовується лямбдальним численням.

Точність, з якою і математичні позначення, і комп'ютерні мови можуть описувати вимоги, і точність, з якою комп'ютери вимагають написання їх інструкцій, добре співвідносяться між собою. Однак неточність природної мови створює величезний бар'єр для її використання для програмування комп'ютерів. Навіть (можливо) найуспішніші середовища програмування природних мов, такі як Wolfram Alpha, потребують значного досвіду роботи в домені, щоб ефективно використовувати.


30

Синтаксис Haskell це близько до людської мови. Він спеціально розроблений так, щоб нагадувати математичні позначення, що є мовою, розробленою людьми (таким чином, людською мовою ) для вираження саме тих концепцій, на яких будується Хаскелл.

Ви можете показати фрагмент коду Haskell будь-якому математику чи логіку, і він зможе зрозуміти це, навіть якщо він ніколи не чув про Haskell і не знає абсолютно нічого про програмування, інформатику чи навіть комп’ютери.

З іншого боку, ви можете показати будь-якому математику чи логіку такий фрагмент коду:

x = x + 1

і він буде зовсім розгублений, кажучи: "Це не має сенсу, немає xтакого, що xдорівнює xплюсу 1".

Незалежно від того, чи є якесь конкретне позначення "криптичним" чи ні, це питання думки та знайомства.


8
З цією відповіддю є лише одна проблема: я не математик.
JohnDoDo

6
@ sepp2k: Я не погоджуюся. Для більшості людей без попереднього впливу мов програмування і деякого основного математичного фону синтаксис Haskell буде набагато простіше зрозуміти , ніж типовий Procedual коду з усіма його побічними ефектами і складними середовищами оператори виконуються. Синтаксис як whereдозволяє ущільнити суть функція в одному рядку.
Бенджамін Баньє

17
-1: ця відповідь здається багато в чому педантичною. Я досить впевнений, що ОП мав на увазі розмовну мову.
Стівен Еверс

6
Насправді я майже впевнений, що x = infinityце дійсно вирішує рівняння.
DeadMG

6
Ну, мови програмування також розроблені людьми .... Отже, за вашим визначенням, вони є людськими мовами.
marco-fiset

13

Я думаю, що ви, напевно, стикаєтесь, це те, на що я теж зіткнувся, вивчаючи функціональне програмування, а це те, що з функціональним програмуванням ви можете (і майже доводиться) думати / працювати на більш високому рівні, ніж ви робите з імперативним програмуванням.

Те, що ви вважаєте менш виразним, я думаю, що насправді більш виразне: вам не потрібно чітко писати кожну дрібницю, і ви можете зробити більше з меншим кодом у функціональному програмуванні - є більше сил на те, що ви пишете.

Наприклад, я можу написати імперативно:

for each (Person person in people)
    print(person.name)

що цілком розбірливо як англійська.

Версія Haskell може бути (і це не дійсно Haskell, але лише для синтаксичного порівняння):

map (print . name) people

що вимагає меншої кількості коду та меншої деталізації розбиття - мені не потрібно розбивати речі на цикл та його змінну (и) ( for each (...)), mapфункція для мене береться за це.

Робота на цьому рівні може дещо звикнути. Якщо це допомагає, Haskell був, мабуть, найскладнішим часом, коли я вивчив нову мову з моменту початку програмування, і я знаю> 10 мов (включаючи Lisp). Це було повністю варто вивчити, хоча.


8

Наразі я зараз стикаюся зі Скалою, тому можу співчувати. Принаймні, з Scala я можу повернутися до імперативного стилю, коли перехід стає занадто жорстким.

Я думаю, що тут грають кілька сил:

  • Дизайнери функціональних мов обов'язково мають сильну математику, тому вони запозичують природні для них математичні позначення.

  • Більша виразність (тобто сила висловлювань, а не близькість до англійської) будь-якої мови має (ІМО) відповідну ціну в крутій кривій навчання. Terseness - високо цінується якість у Scala, і багато речей є необов’язковими.

  • Функціональні мови роблять все дуже по-різному, тому основні операції не відображаються на імперативних конструкціях.


3
Я також хотів би додати, що часто функціональні мови можуть виражати поняття вищого порядку, причому ці абстрактніші складніше назвати
jk.

1
@jk, так, погодився! У той же час, саме тому у них крута крива навчання для програмістів з необхідним досвідом і мало математики (як я), і чому вони варті того.
Ричард Закрити

3

Якщо я правильно зрозумів ваш останній коментар, ваше питання полягає в тому, чому Haskell часто використовує символічні оператори в місцях, де він може також використовувати буквено-цифрові ключові слова (або назви функцій)?

Щодо ключових слів, одна відповідь - це те, що ключові слова не дозволяють використовувати певні слова як імена змінних. Наприклад, я завжди роздратований, коли хочу викликати свої змінні fromта toмовами, де одним із них є ключові слова - як у Python.

Ще одна причина символічних операторів загалом - стислість. Це насправді не застосовується у ваших конкретних прикладах розуміння списку ( <-не коротше in), але в багатьох випадках це є.

Ще одна причина - читабельність. Це може здатися протиінтуїтивно зрозумілим, оскільки символічним операторам часто важче навчитися, оскільки їхні "імена" насправді нічого не говорять про те, що вони роблять (у той час як ім'я функції зазвичай буде), але як тільки ви дізнаєтеся, що робить даний оператор, вирази з символьними операторами інфіксації часто простіше розібратися для людини, ніж один з великою кількістю викликів функції алфа-числових префіксів, оскільки оператори легше візуально відрізнити від операндів таким чином. Наприклад, більшість людей погодиться, що 2 * 3 + 4це легко читається ніж add (mult 2 3) 4або add(mult(2, 3), 4).


@PeterTaylor Ні, я просто дурний ;-) Виправлено зараз.
sepp2k

3

Імперативні комп'ютерні мови здебільшого не ближчі до природних мов, ніж, скажімо, Haskell.

Однак деякі розроблені так, щоб більше нагадувати англійську мову: наприклад, Cobol і Hypercard. Уроки, які я б взяв з цих прикладів,:

  • подібність до природних мов, схоже, не призводить до прямого покращення зручності використання
  • емуляція природних мов безпосередньо може дати комп'ютерні мови, які є багатослівними та неясними

Як повідомляється, комп'ютерна мова Perl була розроблена з урахуванням деяких тонких аспектів природної мови . Я вважаю, що Perl краще, ніж Cobol чи Hypercard, щодо загальної юзабіліті, але люди мають різні думки щодо Perl.


3

Я думаю, що Haskell настільки ж схожий на людську мову, як можна дістатись, не вводячи шалений синтаксис. Це дійсно йде в значній мірі, наприклад, із whereзастереженням про відкладення визначення та із синтаксисом розуміння списку, який саме те, що я написав би на дошці. Він також уникає сторонніх символів, таких як дужки, і має ліберальне використання відступів. Типовий приклад - химерний:

qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
               where lesser = [x | x <- xs, x <= p] 
                     greater = [x | x <- xs, x > p]

Зізнаюсь, це простий приклад, але я не знаю жодної іншої мови, яка б зрозуміла цю, як це.

Робити складніші речі можуть бути важко читати в Haskell, але це стосується типової системи, обмеженого IO, а не синтаксису.

Якщо що, я б сказав, що Хаскелл приніс у жертву синтаксичну простоту, щоб вмістити синтаксис, який більше схожий на людську мову. Схема, схожа на мову, має синтаксис, який дуже далекий від того, що пише людина, але пояснити її правила дуже просто.


3
Я навряд чи назвав би це читабельним для людини. Я знаю, що швидко. Мені відомо, як налаштувати його на декількох різних мовах, я знаю, що це має робити, і я досі не можу створювати голови або хвости з нижньої половини фрагмента коду.
Мейсон Уілер

Я думаю, це дійсно залежить від твого походження. Це так само просто, як і для мене ...
Андреа

2
У будь-якому випадку, це має нагадувати цю нотацію: purplemath.com/modules/setnotn.htm
Андреа

4
Ви впевнені, що цього не повинно бути ++ [p] ++?
Пітер Тейлор

1
@Mason: Мені це здається досить зрозумілим, і я ніколи не писав рядок Haskell
kevin cline

2

Я думаю, що різниця пов'язана з тим, як функціональне / декларативне програмування робить заяви про проблему, як ніби це математична проблема, де як імперативне програмування описує процес . У діловому світі комп'ютерні програми завершують або замінюють фізичні процеси, тож ви можете знайти мову, що відображає це, більш інтуїтивно зрозумілою.

Виявляється, функціональний стиль піддається безпечному використанню декількох процесорів (оскільки це мінімізує можливість зміни та побічні ефекти) - те, про що ми побачимо більше в майбутньому. Крім того, більшість сучасних функціональних мов мають колекції з ітераторами, до яких можна передавати функції. Ці методи можуть дуже ефективно розподілити навантаження на декілька процесорів, навіть не знаючи про це.


Я думаю, що це найкраща відповідь - єдина, яка чітко розрізняє процес і твердження.
Milind R
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.