Scala

Nov. 6th, 2012 04:15 am
metaclass: (Default)
[personal profile] metaclass
Читаю книжку Одерского, до основной шизы еще не добрался, но такое ощущение, что в скале чрезмерно много синтаксического сахара. Типа "тут вы можете скобки опустить, а тут вместо скобок использовать фигурные скобки, а тут мы прямо в параметрах класса сделаем их полями, а в multiline string literal вы можете сделать отступ и stripMargin" и прочая и прочая в том же духе.
Основное из этого, видимо - function literals и вызов методов в стиле a methodName b, без точек и скобок, что делает код более лаконичным, одновременно позволяя при желании превратить код в нечитабельный ад.

Заодно по наводке [livejournal.com profile] jdevelop глянул на http://spray.io/ https://github.com/spray/spray/wiki
Примеры там, конечно, знатный abuse возможностей языка и вычислений на типах, типа extraction-директив с HList в качестве параметра типа.

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

PS: Вот, к примеру:
https://github.com/spray/spray/blob/master/docs/documentation/spray-routing/code/docs/HttpServiceExamplesSpec.scala

В SimpleService HttpResponse реализован как html-код написанный прямо внутри скала-кода. Сижу уже 30 минут ищу, где это преобразование реализовано и как. Т.е. не видя отдельных литералов и их типов (которые без загрузки всего оного кода с зависимостями в IDE/интерпретатор еще и не увидишь), с ходу догадаться, что происходит, достаточно сложно. XML literals, встроенные в язык и где-то implicit для конверсии.

PPS: implicit evidence:
http://jim-mcbeath.blogspot.com/2008/11/scala-type-infix-operators.html
http://stackoverflow.com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-they-documented

По-моему, это уже достаточно сложно, чтобы увлечь психов и стать новыми крестиками. Вот [livejournal.com profile] xeno_by еще приделает макросы - и совсем хорошо станет.

Date: 2012-11-07 08:52 am (UTC)
From: [identity profile] thesz.livejournal.com
Да. Separation of concerns. Не переводить же эту фразу, как "разделение беспокойств" или "разделение интересов".

Date: 2012-11-07 09:00 am (UTC)
From: [identity profile] xeno-by.livejournal.com
Я скорее хотел узнать в чем проявляется лучшее разделение обязанностей.

Date: 2012-11-07 09:33 am (UTC)
From: [identity profile] thesz.livejournal.com
В ленивости?

Как я понимаю, short circuit оператор && наверняка встроен в Scala.

Date: 2012-11-07 09:46 am (UTC)
From: [identity profile] xeno-by.livejournal.com
Понятно.

Оператор пока еще да, встроен.

Date: 2012-11-07 10:01 am (UTC)
From: [identity profile] thesz.livejournal.com
Вот-вот. И сейчас вы накрутите ещё всякого. ;)

Date: 2012-11-07 10:07 am (UTC)
From: [identity profile] isorecursive.livejournal.com
Наверное, встроен, для эффективности, но можно сделать и средствами языка:
http://www.scalakata.com/509a323ce4b093f3524f38fa
Но, конечно, это by-name, а не by-need.

Date: 2012-11-07 10:32 am (UTC)
From: [identity profile] thesz.livejournal.com
Вы определение && на Хаскеле видели?

И как я понимаю, булевский тип тоже встроен.

Date: 2012-11-07 10:45 am (UTC)
From: [identity profile] isorecursive.livejournal.com
Что-нибудь такое ?:
True && True = True
_    && _    = False

Дело в том, что паттерн-матчинг в хаскеле дешугарится в case, а это такой же встроенный примитив, как и if.

@ И как я понимаю, булевский тип тоже встроен.
Ну это всё мелочи, по-моему. Можно вот так:
http://www.scalakata.com/509a3b5ce4b093f3524f38fd
и так:
http://www.scalakata.com/509a3bb3e4b093f3524f38ff
Edited Date: 2012-11-07 10:46 am (UTC)

Date: 2012-11-07 11:22 am (UTC)
From: [identity profile] thesz.livejournal.com
Нет, не такое. Ваш оператор не будет short circuit. В частности, для False && error "Badam!" будет вычислен error "Badam!"

True && x = x
False && _ = False

Видите ли, в чём дело. Я могу 1) сделать свой собственный if и 2) воспользоваться кодированием конструкторов и деструкторов (сравнение с образцом) через функции. Это так называемое кодирование Чёрча.

Если вы не знали, то вот вам пример (я уж задолбался его приводить):
*Main> let true = \a b -> a
*Main> let false = \a b -> b
*Main> let a &&& b = a b false
*Main> let ifThenElse c a b = c a b
*Main> ifThenElse (true &&& false) 10 12
12
*Main> ifThenElse (true &&& true) 10 12
10
*Main> ifThenElse (true &&& true) 10 (error "Badam!")
10
*Main> ifThenElse (false &&& error "Badam!") 10 12
12

Попробуйте сделать такое на Scala.

На таком кодировании основана AwesomePrelude - как можно взять практически обычный Хаскель (пара расширений) и скомпилировать его в JS библиотекой. Без макросов. Без трансляции, как у меня в HHDL. Простой библиотекой.

Short-circuit операторы я могу также сделать и для других значений. Например, для Q Bool, если сочту это нужным. Поэтому я и обратил ваше внимание на встроенность bool.

Date: 2012-11-07 12:36 pm (UTC)
From: [identity profile] xeno-by.livejournal.com
Касательно AwesomePrelude предлагаю посмотреть в сторону http://infoscience.epfl.ch/record/179888/files/js-scala-ecoop.pdf. Тоже делается Скалой с парой расширений.

Date: 2012-11-07 01:54 pm (UTC)
From: [identity profile] thesz.livejournal.com
Интересно.

Получение AST из выражений я и сам хотел.

Date: 2012-11-07 12:38 pm (UTC)
From: [identity profile] xeno-by.livejournal.com
> для False &&& error "Badam!" будет вычислен error "Badam!"
Не будет, т.к. соответствующий параметр call-by-name.

Date: 2012-11-07 01:05 pm (UTC)
From: [identity profile] isorecursive.livejournal.com
@ Нет, не такое. Ваш оператор не будет short circuit. В частности, для False && error "Badam!" будет вычислен error "Badam!"
Не будет: http://ideone.com/1Tcr6D

@ Попробуйте сделать такое на Scala.
Не проблема: http://www.scalakata.com/509a5a9fe4b093f3524f3994

В скале нотация "(=> T)" в аргументах обозначает by-name.

Date: 2012-11-07 01:53 pm (UTC)
From: [identity profile] thesz.livejournal.com
Согласен, прикольно. Чем-то Алгол-68 напоминает.

Как я понимаю, call-by-name аргумент будет вычислен столько раз, сколько мы его будем использовать?

Date: 2012-11-07 02:12 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Да, он не мемоизируется, да и мутабельность там везде, много не намемоизируешь.

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-07 02:29 pm (UTC) - Expand

Date: 2012-11-07 03:38 pm (UTC)
From: [identity profile] isorecursive.livejournal.com
@ Алгол-68
Почему-то рассмешило.

@ Как я понимаю, call-by-name аргумент будет вычислен столько раз, сколько мы его будем использовать?
Ну да, потому и by-name.
Кстати, только что придумал как на implicit-конверсиях сделать by-need!
Конечно, оверхед по производительности побольше чем в хаскеле, но по выразительности - нулевой!
Edited Date: 2012-11-07 04:00 pm (UTC)

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-07 04:09 pm (UTC) - Expand

(no subject)

From: [identity profile] isorecursive.livejournal.com - Date: 2012-11-07 06:32 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-07 07:10 pm (UTC) - Expand

(no subject)

From: [identity profile] isorecursive.livejournal.com - Date: 2012-11-07 07:33 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-07 07:47 pm (UTC) - Expand

Date: 2012-11-09 04:20 am (UTC)
From: [identity profile] valentin budaev (from livejournal.com)
> Если вы не знали, то вот вам пример (я уж задолбался его приводить):

Такой if в любом языке пишется, достаточно будет обернуть аргументы в delay. С другой стороны, в хаскеле нельзя реализовать свой begin - он в хаскеле встроен (и называется case). То есть в хаскеле приходится руками оборачивать выражения в force. Это известная эквивалентность ленивого и энергичного порядка. На языке теорката она выражается в том, что в категории соответствующей ленивому порядку нету сумм, а в категории, соответствующей энергичному порядку - произведений, т.о. полученные категории дуальны.

Date: 2012-11-09 09:25 am (UTC)
From: [identity profile] thesz.livejournal.com
В принципе, вы подтвердили мою мысль, но не до конца. Важно количество обёрток.

В строгом языке - все аргументы, в ленивом - в нескольких местах.

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-10 09:37 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-10 10:45 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-11 12:57 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-11 01:23 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-11 03:10 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-11 10:04 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-11 03:31 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-11 10:18 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-12 05:47 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-12 06:27 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-12 08:55 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-12 09:00 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-12 11:46 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-12 07:25 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-13 02:23 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-13 04:19 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-14 03:46 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-14 08:21 am (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2012-11-15 04:46 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-15 10:21 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-15 12:21 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-15 08:44 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-16 02:12 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-16 08:31 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-16 09:54 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-16 11:00 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-16 11:36 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-16 01:08 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-16 01:45 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-16 05:47 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-17 03:41 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-17 04:05 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-17 07:18 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-17 06:01 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-18 04:03 am (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2012-11-18 11:11 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-25 12:53 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-13 10:20 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-14 03:49 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-14 08:29 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-15 04:54 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-15 08:53 am (UTC) - Expand

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2012-11-15 09:16 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-15 10:54 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-15 12:01 pm (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-11 03:38 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-11 01:29 am (UTC) - Expand

(no subject)

From: [identity profile] valentin budaev - Date: 2012-11-11 03:01 am (UTC) - Expand

Date: 2012-11-07 10:34 am (UTC)
From: [identity profile] metaclass.livejournal.com
А что будет, если есть два импортированных класса с операторами &&& и implicit-конверсией - какой из них используется в этом случае?

Date: 2012-11-07 11:02 am (UTC)
From: [identity profile] isorecursive.livejournal.com
Если подходит первый (по типами и сигнатуре), то он, если нет - будет попытка использовать конверсию.
И это, наверное, самый сложный и хитрый момент в имплицитных конверсиях. По мне, лучше воздерживаться от них, и использовать только обогащения (новые implicit class, но их пока нет на scalakata), и только такие, которые не создают конфликтов имён.
И самое плохое в имплицитных конверсиях, что люди думают, будто имплицитные значения (type-directed скоупинг) - что-то близкое по духу, и тоже стрёмное.

Date: 2012-11-07 11:31 am (UTC)
From: [identity profile] xeno-by.livejournal.com
+1 про implicit vals

Date: 2012-11-07 11:31 am (UTC)
From: [identity profile] xeno-by.livejournal.com
Если подходят оба, будет ошибка компиляции.

Date: 2012-11-11 01:34 am (UTC)
From: [identity profile] thesz.livejournal.com
Язык Ада, в прямом и переносном смысле этого слова. В Аде точно такие же правила.

Date: 2012-11-11 08:25 am (UTC)
From: [identity profile] xeno-by.livejournal.com
В переносном смысле вы имеете ввиду, что это что-то плохое?

Date: 2012-11-11 10:09 am (UTC)
From: [identity profile] thesz.livejournal.com
Да.

Я писал разбор VHDL и писал на нем самом. VHDL это суперсет первой Ады.

(no subject)

From: [identity profile] xeno-by.livejournal.com - Date: 2012-11-11 10:12 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-11-11 11:04 am (UTC) - Expand

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 2nd, 2025 10:00 pm
Powered by Dreamwidth Studios