LINUX.ORG.RU

Haskell 2010

 , haskell 2010, haskell-prime,


0

0

В списке рассылки появилось сообщение от Simon Marlow, где объявляется о новой ревизии языка Haskell — Haskell 2010.

Расширения, которые вошли в новый стандарт:

  • DoAndIfThenElse
    Синтаксис if-then-else будет выглядеть как «exp -> if exp1 [;] then exp2 [;] else exp3».
    «then» и «else» можно будет располагать на одном уровне.
  • HierarchicalModules
    Иерархическая структура модулей наконец-то войдёт в официальный стандарт.
  • EmptyDataDeclarations
    Конструкторы типов без конструкторов данных (это типы с единственным значением: _|_).
  • FixityResolution
    Изменения в синтаксическом разборе операторов с приоритетами. Важно только для официального отчёта.
  • ForeignFunctionInterface
    Давно использующийся FFI тоже войдёт в Haskell2010.
  • LineCommentSyntax
    Небольшое исправление, связанное со строчными комментариями.
  • PatternGuards
    Сопоставление с образцами в охраняющих выражениях.
  • RelaxedDependencyAnalysis
    Ослабленный анализ зависимостей: при выводе типов игнорируются ссылки на связанные переменные с явно указанными типами. Monomorphism restriction is gone.
  • LanguagePragma
    В отчёте будет упоминаться прагма «LANGUAGE» с расширениями: DoAndIfThenElse, HierarchicalModules, FixityResolution, PatternGuards, NoNPlusKPatterns, RelaxedDependencyAnalysis, LineCommentSyntax, EmptyDataDeclarations, LanguagePragma и ForeignFunctionInterface.
    Реализация, поддерживающая прагмы, должна обрабатывать «{-# LANGUAGE Haskell2010 -#}» (включает все вышеперечисленые расширения).
  • NoNPlusKPatterns
    Убран вариант синтаксиса при сопоставлении с образцом вида «n + k» для натуральных чисел.

Подробнее обо всех расширениях можно узнать здесь:
http://hackage.haskell.org/trac/haske...

>>> Сообщение в списке рассылки

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

Эффективнее, чем что?

Нельзя купить плохую книгу на языке оригинала? Вон сколько помоев на автора practical ocaml вылили, думаю, не просто так.

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

Эффективнее чем ждать перевода + чем потом пытаться понять, что же хотел сказать автор и почему все так плохо в русском варианте. Хотя, конечно, книги от O'Railly, переведенные, если не ошибаюсь, издательством «Питер», как минимум несколько лет назад, были весьма неплохи.

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

[code

zip7 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [(a, b, c, d, e, f, g)]

[/code] [code] zip7 as bs cs ds es fs gs = getZipList $ (,,,,,,) <$> ZipList as <*> ZipList bs <*> ZipList cs <*> ZipList ds <*> ZipList es <*> ZipList fs <*> ZipList gs [/code] Аппликативные функторы рулят и бибикают

Miguel ★★★★★
()
Ответ на: комментарий от capricorn20
> zip7 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [(a, b, c, d, e, f, g)]
zip7 as bs cs ds es fs gs = getZipList $ (,,,,,,) <$> ZipList as <*> ZipList bs <*> ZipList cs <*> ZipList ds <*> ZipList es <*> ZipList fs <*> ZipList gs

Аппликативные функторы рулят и бибикают.

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

>> Его фишки - квинтенсенция всех успешных идей в программировании, за последние 20 лет в одном флаконе.

Нет там зависимых типов *хотя бы* на уровне с++ и системы эффектов.

Или capability calculus, например.

Кстати, в C++ нет зависимых типов.

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

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

Э-э-э...

strlen("     ")

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

> > А дозволение небезопасных операций только в помеченных модулях тривиально реализуемо.

Можно пример плз какой-нить. Интересно на это глянуть.

Называется Haskell. «Пометка» пишется как [code] import System.IO.Unsafe [/code]

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

> А дозволение небезопасных операций только в помеченных модулях тривиально реализуемо.

Можно пример плз какой-нить. Интересно на это глянуть.

Называется Haskell. «Пометка» пишется как

import System.IO.Unsafe

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

> зависимые типы: как на хаскеле сказать

const int n=17;

...

Z<n> f(int x) { return mod<n>(x+(n/2)); }

Оно станет зависимыми типами в тот момент, когда с n уберётся модификатор const.

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

> Оно станет зависимыми типами в тот момент, когда с n уберётся модификатор const.

Подозреваю, что в этом проблем нет. Накатай примерчик в предположении, что n может быть не константой, а я его (минимально) перепишу так, чтобы ж++ его съел (и да, несколько строчек, которые компилятору необходимо отвергнуть)

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

> Кстати, в C++ нет

Смелый вывод.

Давай ссылку на 1) хорошее определение зависимых типов 2) описание задачи, которая требует зависимых типов и не ложится на плюсы (ну или наваяй тут)

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

> Capability Calculus, that supports region-based memory management, не?

Угу.

Давай ссылку на 1) хорошее определение зависимых типов

На строго формальное сходу не дам, но на вменяемое - http://en.wikipedia.org/wiki/Dependent_type

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

Тип данных «список»; функция «убрать последний элемент», которая не позволит скомпилировать программу, если хотя бы в какой-то момент её применят к пустому списку (ещё раз: ошибка должна обнаруживаться при компиляции!); функция main, которая случайным образом выбирает число n от 0 до 10000, создаёт список длины n и применяет к нему предыдущую функцию n раз.

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

> Тип данных «список»; функция «убрать последний элемент», которая не позволит скомпилировать программу, если хотя бы в какой-то момент её применят к пустому списку (ещё раз: ошибка должна обнаруживаться при компиляции!); функция main, которая случайным образом выбирает число n от 0 до 10000, создаёт список длины n и применяет к нему предыдущую функцию n раз.

Я попробую, вполне возможно получится (тут нужны рассуждения на уровне succ pred zero).

Вот только после этого ты войдешь во вкус и объявишь, что этого мало, а еще требуются рассуждения на уровне «нечетное простое число представимо в виде суммы двух квадратов, экви оно равно 1 по модулю 4».

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

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

> Я попробую, вполне возможно получится

Не получится. Ни на плюсах, ни на хаскеле. Если, конечно, не сделать ветвление на десять тыщ веток.

границу «где зависимые типы, а где нет» ты провел произвольно

Эта граница достаточно хорошо известна. По той же ссылке есть список языков, где зависимые типы есть (в той или иной мере). В C++ их нет.

Просто ТИП одной переменной может зависеть от ЗНАЧЕНИЯ другой (при том, что полностью сохраняется статическая типизация). В то время как в плюсовых шаблонах параметрами может быть только то, что при компиляции известно, то бишь - не переменные. И усё.

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

мне твой пример как-то не нравится (n-n=0)

поэтом я предлагаю свой

допустим, у нас есть тип Matrix<m,n> и операция умножения матриц

когда m,n — константы, то применимость умножения ясна

однако нам хочется запустить прогу, ввести в stdin натуральное число x, затем ввести пару матриц Matrix<m,х> и Matrix<х,n> (m,n — константы) и вычислить и вывести произведение этих матриц

система типов должна обеспечить невозможность умножить матрицы если x!=x (надеюсь, ясно о чем я)

это все делается в плюсах с полпинка.

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

> а еще требуются рассуждения на уровне «нечетное простое число представимо в виде суммы двух квадратов, экви оно равно 1 по модулю 4».

Под рассуждениями понимаются рассуждения времени компиляции.

Могут и пригодиться. В принципе, такие вещи вполне на языке зависимых типов доказываются.

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

> однако нам хочется запустить прогу, ввести в stdin натуральное число x, затем ввести пару матриц Matrix<m,х> и Matrix<х,n> (m,n — константы) и вычислить и вывести произведение этих матриц

система типов должна обеспечить невозможность умножить матрицы если x!=x (надеюсь, ясно о чем я)

это все делается в плюсах с полпинка.

OK, показывай, интересно. Думаю, если ты пропустишь сам процесс ввода матриц, я переживу.

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

> По той же ссылке есть список языков, где зависимые типы есть (в той или иной мере)

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

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

> ключевые слова — в той или иной

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

C++ туда не входит, потому что в нём нет типов, зависящих от рантаймового параметра.

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

> OK, показывай, интересно. Думаю, если ты пропустишь сам процесс ввода матриц, я переживу.

я видимо так и сделаю завтра в этом треде

однако надо решить принципиальный вопрос — если относительно целых чисел (от которых зависит тип Matrix) компилятору известно только то, что x==x, и *неизвестно* (и вероятно не может быть объяснено), что (3х-х)/2==х, будет ли это зависимые типы?

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

Кстати, хаскельный аналог целочисленных параметров в темплейтах тоже существует - type-level arithmetics.

Простейший вариант выглядит так: [code] data Z = Zero newtype S n = Succ n [/code] После чего вместо const int n = 3 можно использовать тип S (S (S Z)). Довольно стандартная техника, правда, в менее удобных обозначениях.

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

> однако надо решить принципиальный вопрос

А он важен для твоего решения?

Может, хоть намекнёшь, какая там идея?

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

> что (3х-х)/2==х

на самом деле в это видимо можно заставить компилятор *поверить*, но только силой, и проверить он тебя не сможет

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

> Может, хоть намекнёшь, какая там идея?

параметром шаблона может быть любой статический объект, и сравнивать их адреса компилятор умеет

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

если это не покатит, есть другие варианты, надо пробовать все же

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

> А он важен для твоего решения?

да, важен — если нужна проверяемость логики вида (3х-х)/2==х (а не навязывание ее силой), то лучше и не браться

посему нужно полноценное определение зависимых типов

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

По-моему, мы договорились уже: нужна проверяемость равенства размеров двух матриц (слушай, давай для простоты будем не произведение матриц, а скалярное произведение векторов считать?)

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

> По-моему, мы договорились уже: нужна проверяемость равенства размеров двух матриц (слушай, давай для простоты будем не произведение матриц, а скалярное произведение векторов считать?)

скалярное произведение векторов годится

а насчет проверяемости мне так и не понятно до конца, вот на псевдокоде:

std::cin >> x;
Vector<x> a;
Vector< 3*a.dim > b;
double z0 = b*a; // ошибка компиляции
Vector< (b.dim-a.dim)/2 > c;
double z1 = c*a; // х.з., скорее всего не смогу, но идеи есть.
Vector<x> d;
double z2 = a*d; // реально

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

> std::cin >> x;

Vector<x> a;

В этот момент всё и обломится. x - не константа и параметром шаблона быть не может.

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

> В этот момент всё и обломится. x - не константа и параметром шаблона быть не может.

я ж не дурак и сказал «на псевдокоде»

я тебя спрашиваю про «double z1 = c*a» — если ее компилятор не съест (ругнется), будет ли вектор зависимым типом?

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

Извини, псевдокод слишком неконкретен, чтобы я мог хотя бы понять твой вопрос.

На самом деле, статически гарантировать, что два вектора имеют ОДИНАКОВУЮ длину, в общем-то, несложно. В Хаскеле. А вот гарантировать, что они имеют длину, равную тому n, которое введёт пользователь - таки нельзя.

data Nil = Nil
data Succ a = Succ Float a
class Prod a where prod :: a -> a -> Float
instance Prod Nil where prod Nil Nil = 0
instance Prod a => Prod (Succ a) where prod (Succ f1 a1) (Succ f2 a2) = f1 * f2 + prod a1 a2
test :: Prod a => Integer -> a -> a -> Float
test 0 a1 a2 = prod a1 a2
test n a1 a2 = test (n-1) (Succ (n^2) a1) (Succ (n^3) a2)
В плюсах, по-моему, такое не получится (или получится, но сложнее) - упрёшься в бесконечное развёртывание шаблонов.

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

> Извини, псевдокод слишком неконкретен, чтобы я мог хотя бы понять твой вопрос.

я думал ты поймешь.

а так придется тупо все переписывать словами, хотя это с другой стороны все-таки надо.

ладно, перепишу и запощу вместе с плюсовым кодом.

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

> /me представил «менее удобные обозначения» для n=9000 и ужоснулсо...

Это же простейший вариант. Можно, например, двоичную систему сделать, будет короче.

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

О мой анонимный друг, пролей свет своей учёности на нас, необразованных, и объясни, на кой хрен ты это написал?

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

Ну да, функция «сиськи», открыли Америку.

Вы ещё про значение «жопа», обозначаемое (_|_), вспомните.

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

Оно вызывает плохие ассоциации у адептов. Ведь это символ всего, что не хаскель.

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

Да я понимаю, но выглядит все-равно по марсиански. Впрочем, те же решения я видел и в HOL, но там они прикрыты синтаксическим сахаром.

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