LINUX.ORG.RU

Языку Haskell исполнился 21 год

 ,


0

3

1 апреля 1990 года был опубликован документ под названием «The Haskell Report», а также первый стабильный релиз того самого ЯП для штангистов.

>>> Подробности



Проверено: svu ()
Последнее исправление: Dendy (всего исправлений: 2)
Ответ на: комментарий от sanuda

> Может ты хотел сказать, что функция — это отношение (то есть множество пар (a, b) ∊ (X, Y)) такое, что по первому элементу эти пары уникальны?

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

Чё-то вы ребятки совсем загнались. Давайте определим что есть функция возвращающая 5: Y(x): x -> 5, для любого x ∊ R

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

Давайте определим что есть функция возвращающая 5: Y(x): x -> 5, для любого x ∊ R

зачем? это тривиально и неинтересно

что касается исходного вопроса, то отображение из пустого множества есть только одно - на пустое множество; 0ⁿ = 0 для любого n ∊ ℤ \ {0}, 0⁰ = 1

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

>> Может ты хотел сказать, что функция — это отношение (то есть множество пар (a, b) ∊ (X, Y)) такое, что по первому элементу эти пары уникальны?

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

Чё-то вы ребятки совсем загнались. Давайте определим что есть функция возвращающая 5: Y(x): x -> 5, для любого x ∊ R

Речь шла о функциях от пустого множества, возвращающих 5.

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

Если вы загляните чуть выше, то вы поймёте, что речь шла о константе как о функции. (Кто-то заявил, что константа не может быть функцией).

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

> Если вы загляните чуть выше, то вы поймёте, что речь шла о константе как о функции. (Кто-то заявил, что константа не может быть функцией).

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

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

> Речь шла о функциях от пустого множества, возвращающих 5.

А, ну да, тогда так: y(x): x -> 5, x ∊ X \ {перечёркнутый ноль}, где X - произвольное множество.

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

>> Речь шла о функциях от пустого множества, возвращающих 5.

А, ну да, тогда так: y(x): x -> 5, x ∊ X \ {перечёркнутый ноль}, где X - произвольное множество.

Функция как функция. Главное, чтоб значения никуда не девались. 5 ведь — значение?

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

> Да. Т.е. у меня - да, не знаю как в хацкеле.

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

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

А почему нельзя ввести класс функций f_n: 1 -> Z, где каждая функция f_n отображает множество из 1 элемента на множество целых чисел, а конкретно на число n? Ведь каждая такая f в отдельности будет однозначна.

Разумеется, можно так же определить любую f_x: 1 -> X.

P.S. Конкретно в Haskell 1 можно заменить на ().

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

А почему нельзя ввести класс функций f_n: 1 -> Z, где каждая функция f_n отображает множество из 1 элемента на множество целых чисел

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

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

> А почему нельзя ввести класс функций f_n: 1 -> Z, где каждая функция f_n отображает множество из 1 элемента на множество целых чисел, а конкретно на число n? Ведь каждая такая f в отдельности будет однозначна.

Разумеется, можно так же определить любую f_x: 1 -> X.

P.S. Конкретно в Haskell 1 можно заменить на ().

В хаскеле такие функции уже есть: const 1, const 5.

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

отображение из пустого множества есть только одно

я, кстати, неправ - ровно одно отображение (пустая функция) есть на пустое множество

пустое множество является инициальным объектом, одноэлементное - терминальным

впрочем, какая кому разница

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

> Вы же тут спорили насчёт того, можно ли представить значение как функцию.

Лично я спорил с утверждением, что в Хацкеле нет значений (не являющихся функциями), а не с существованием const. (const 5 :: a -> Int) ведь значение возвращает?

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

Кстати, как вообще может пустое множество участвовать в отображениях?

Ведь там нет элементов вообще, поэтому нечего отображать и не на что отображать.

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

> Лично я спорил с утверждением, что в Хацкеле нет значений (не являющихся функциями), а не с существованием const. (const 5 :: a -> Int) ведь значение возвращает?

Ну, Haskell Report говорит о том, что значения есть. Однако, в GHC и значения. и ф-ции представлены thunk'ами, которые работают примерно как ф-ции.

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

> Кстати, как вообще может пустое множество участвовать в отображениях?

Ведь там нет элементов вообще, поэтому нечего отображать и не на что отображать.

Видимо, тогда отображение само будет пустым множеством.

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

>> Лично я спорил с утверждением, что в Хацкеле нет значений (не являющихся функциями), а не с существованием const. (const 5 :: a -> Int) ведь значение возвращает?

Ну, Haskell Report говорит о том, что значения есть. Однако, в GHC и значения. и ф-ции представлены thunk'ами, которые работают примерно как ф-ции.

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

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

Или я что-то пропустил?

пропустил. если 5 имеет тип () -> Int, т.е. это константная функция, возвращающая 5, то какой тип у её возвращаемого значения? Int? но мы ведь только что решили, что у нас всё есть функция, и значит возвращать мы можем только 5 :: () -> Int, итого () -> () -> Int. и так далее ad infinum, как и проиллюстрировано по ссылке, мелькавшей здесь уже дважды

таким образом ты получил не унарную константную функцию, а ∞-арную. Haskell бесконечных типов не поддерживает, если что

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

Кстати, как вообще может пустое множество участвовать в отображениях?

Ведь там нет элементов вообще, поэтому нечего отображать и не на что отображать.

в 0 нечего складывать, а в 1 - умножать, но это ведь тебя не смущает? есть хорошая заметка на эту тему, рекомендую

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

А, так вы о возможности проделать такое для всех значений... Sorry, не понял. Ну тогда конечно невозможно :)

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

Видимо, тогда отображение само будет пустым множеством.

да. это, в частности, позволяет сделать из множеств категорию

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

[i]>Ну вот и проблема решена.[/i]

[i]>5 :: Int <=> (n5 :: () -> Int) ()[/i]

[i]>Или я что-то пропустил?[/i]

Функция может возвращать каждый раз новые thunk'и. Поэтому, например, мемоизация работать не будет так, как это было бы возможно в случае обычных значений, thunk которых всегда один и тот же.

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

если 5 имеет тип () -> Int, т.е. это константная функция, возвращающая 5, то какой тип у её возвращаемого значения? Int?

Ну если брать не Int, а настоящий Nat, то 0 будет принадлежать универсуму значений и будет ассоциирован со стрелкой 1 -> Nat из универсума типов (где 1 это терминальный объект категории (и единица произведения в категории), можно считать что это ()), а все остальные числа будут композициями стрелок вида Nat -> Nat.

  (1 : U') -- (0 : U) --> (Nat : U') ------\
                            ^              |
                            |              |
                            |              |
                            `-- (+1 : U) --^

Т.е. все конструкторы без аргументов ([], True, False, Nothing, ...) имеют тип (1 -> что-то) («иметь тип» это объект-значение из U ассоциирован (::) с объектом-типом (стрелкой) из U').

А с точки зрения системы типов ничего кроме настоящих типов и их конструкторов и нет.

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