LINUX.ORG.RU

Любителям ()$. Хаскелистам и лисперам


0

2

Вот я читаю ваши треды о том, какие, якобы, хорошие языки лишп и хацкель, а также про то, как хаскелисты умеют свои точки и доллеры, лол.

А давайте посчитаем факториал^W среднее арифметическое списка на этих языках. Причём будем использовать function-level программирование. Не допускается использование ни одной переменной (т.е. идентификаторы можно связывать только с функциями). Боюсь, на лиспике ничего не выйдет, так как он не умеет это. Всё, что можно это вот:

(defun avg (list) (/ (reduce #'+ list) (length list)))

На хаскелле нужно быть профессором, чтобы решить эту задачу. Я бился 40 минут и ничего не вышло.

А на очень мощном и современном языке J задачка решается в миг:

avg=: +/ % #

на sclang тоже просто

var avg = _.sum / _.size

Думаю, в первую очередь надо учить такие языки, которые обеспечивают максимальную свободу написания кода. Долой явно прописанные аргументы функций и переменные!

Жду от хаскелистов решения

Это к тому, что лиспофанбои пишут, что якобы не представляют, как написали бы скобкокод на других языках (там же нет скобок!!!!) А такую элементарщину как среднее арифметическое там приходится вон как длинно писать. А Хаскелисты с ними спорят

niemand
() автор топика
Ответ на: комментарий от quantum-troll

У ТС в var avg = _.sum / _.size — _ — тоже (неявный) аргумент. Т.ч. всё в порядке. Аргумент — не переменная, тем более в контексте J/APL.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от anonymous

Я знаю. ;) Но, признаюсь, что J я не осилил. И всё из-за его ASCII-вости. Читать сложно. Толи дело APL — всё ясно и чётко!

beastie ★★★★★
()
Ответ на: комментарий от beastie

Аргумент — не переменная, тем более в контексте J/APL.

Вообще-то всё суть неявного программирования в том, что аргументы не нужны: мы оперируем исключительно функциями.

У ТС в var avg = _.sum / _.size — _ — тоже (неявный) аргумент.

Да, тут тоже фэйл. Не дотягивает sclang до уровня FP и J, что поделаешь.

quantum-troll ★★★★★
()
Ответ на: комментарий от anonymous

Хех, я про liftM2 первый раз слышу. Не удивительно, что не смог написать

А зачем тут эти ваши монады?

anonymous
()
Ответ на: комментарий от quantum-troll

мы оперируем исключительно функциями

Но функции могут иметь несколько аргументов и их надо как-то различать. Т.ч. нет, не согласен.

beastie ★★★★★
()

А на очень мощном и современном языке J задачка решается в миг

всегда найдётся ЯП в котором конкретно заданная задача является элементарной операцией. Например может быть задан ЯП (причём тюринг-полный) в коем «среднее арифметическое множества X» кодируется скажем «_X»

MKuznetsov ★★★★★
()
Ответ на: комментарий от beastie

Но функции могут иметь несколько аргументов и их надо как-то различать.

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

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll

функции вроде [ и ], возвращающие, соответственно, левый или правый аргумент

Что тождественно функциям ⍺ и ⍵ (назовём их аргументами). You fail.

beastie ★★★★★
()

А в этих современных ЯП можно реализовать прототипную объектную систему?

ados ★★★★★
()

Пфф…

foldl (*) 1 . flip take [1..]
ну или даже
product . flip take [1..]

KblCb ★★★★★
()
Последнее исправление: KblCb (всего исправлений: 1)
Ответ на: комментарий от beastie

RE: Сообщение удалено beastie по причине 5.1 Нецензурные выражения (0)

Не буянь, мы все равно что в /c/ сейчас.

------------------

Второй вариант:

Prelude> let a = \_ -> 3
Prelude> a()
3
:coolface:

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от beastie

Что тождественно функциям ⍺ и ⍵ (назовём их аргументами).

Нет, не тождественно. Прямой APL'овский аналог [ и ] это ⊢ и ⊣. Опять же, [ — функция, возвращающая свой левый аргумент. Т.е 2 (+ [ -) 3 возвращает 5 — сумму двух и трёх, вычисленную левой функцией. Механизм крючков и вилок позволяет весьма свободно комбинировать функции, без вообще каких-либо аргументов. У APL'а такого механизма нет, поэтому неявное программирование на нём не реализуется.

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от anonymous

Используется аппликативный функтор «функция из» — div <$> sum <*> length. div <$> sum — из «функции из» списка в сумму и функции деления двух чисел делается «функция из» списка + числа, дающая деление суммы этого списка на это число, _ <*> length — из «функции из» списка в функцию из числа (на которое делим сумму) в результат (деления) и «функции из» списка в длину делаем «функцию из» списка в среднее.

motto
()

ну не твое это) забей просто, черт с ним, пусть пишет, кто умеет:)

anonymous
()

нужно быть профессором, чтобы решить

(а вот ненадо прогуливать лекции) достаточно знать математику, понимать область определения, граничные условия и цели применения

avg(X)=sum(X)/count(X)=ln(exp(sum(X)/count(X)))...

это к тому что avg(X) можно привести к композиции других функций, что в определённых условиях может быть полезным. А вот посчитать конкретное значение - то да, на любом языке надо сложить величины и поделить на их кол-во.

MKuznetsov ★★★★★
()
user=> (def avg (comp (partial apply /) (juxt (partial apply +) count)))
#'user/avg
user=> (avg [1 2 3 4])
5/2
PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)

На кухню забегает эрланг, хватает обед, который готовили хаскелолиспы и убегает, на ходу запивая чаем, который стырил ранее )

f(L) -> lists:sum(L) / length(L).

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

L

Не допускается использование ни одной переменной (т.е. идентификаторы можно связывать только с функциями)

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Ничего не мешает сделать L фей и дописать скобочки. Но я всё равно спорить не буду тк в фп нуб, да.

nanoolinux ★★★★
()
Ответ на: комментарий от Deleted

point-free стиле

Point-free — новомодное хаскельное название для неявного программирования.

quantum-troll ★★★★★
()

Кстати, конкатенативные языки (да, это тоже функциональщина) тоже могут в неявное программирование:
[ sum ] [ length ] bi /

quantum-troll ★★★★★
()

Лол, почему я, вчерашний школьник, знакомый с хаскеллем около года (при этом, использую его не часто), написал за 5 минут?

(sum &&& (fromIntegral . length)) >>> uncurry (/)
anonymous
()
Ответ на: комментарий от Deleted

А дробь теперь не число?

Ну напиши (avg [1.0 2.0 3.0 4.0]), будет тебе плавающая точка.

PolarFox ★★★★★
()

avg=: +/ % #

Так это то же самое что и:

(defun avg (list) (/ (reduce #'+ list) (length list)))

Только редьюс у тебя встроенный

anonymous
()
Ответ на: комментарий от anonymous

list
Причём будем использовать function-level программирование. Не допускается использование ни одной переменной (т.е. идентификаторы можно связывать только с функциями).

Ну ты понял.

quantum-troll ★★★★★
()
Ответ на: комментарий от beastie

asket

asketh

0 bottles of beer on the wall

Нет таких слов в песне. Правильное окончание:

1 bottle of beer on the wall, 1 bottle of beer. Take one down and pass it around, no more bottles of beer on the wall.

No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall.

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

Кстати, твой староанглийский переводится как «ты спрашивает, ты получишь».

Gentooshnik ★★★★★
()

т.е. идентификаторы можно связывать только с функциями

Не понял, а что, функция уже отличается от данных?

И да, задачка твоя решается тривиально:

average = (/) <$> sum <*> fromIntegral . length

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 2)
Ответ на: комментарий от PolarFox

L

Не допускается использование ни одной переменной (т.е. идентификаторы можно связывать только с функциями)

т.е. идентификаторы можно

Идентификатор L параметра при вызове нашей функции avg можно связать с другой функцией: avg(lists:seq(1, 5))

Иначе так бы и писали, что нельзя обращаться к параметрам функции через идентификаторы, только неявно.

Языки, в которых такое возможно, скорее всего, густо посыпаны сахаром.

blexey ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.