Существует ли язык программирования со строгим контролем типов, который позволяет Вам определять новые операторы?

  1. Я пока не могу комментировать, но учтите, что по умолчанию Visual Studio 2008 автоматически переходит через свойства, поэтому в этом случае атрибут DebuggerStepThrough больше не нужен.

  2. Кроме того, я не заметил, чтобы кто-то показывал, как объявлять лямбда без параметров (полезно для реализации Action <>)

    () => DoSomething(x);

Вы также должны прочитать о замыканиях - я не достаточно умен, чтобы объяснить их правильно. Но в основном это означает, что компилятор делает умные вещи, так что x в этой строке кода все равно будет работать, даже если он выходит из области видимости после создания лямбды.

  1. Недавно я также обнаружил, что вы можете притворяться, что игнорируете лямбда-параметр:

    (e, _) => DoSomething(e)

Это не совсем игнорирование, просто _ является действительным идентификатором. Таким образом, вы не можете игнорировать оба параметра, как это, но я думаю, что это своего рода аккуратный способ показать, что мы не заботимся об этом параметре (обычно это EventArgs, который имеет значение .Empty).

8
задан niklasfi 26 July 2009 в 12:53
поделиться

13 ответов

Как сказал EFraim , Haskell упрощает эту задачу:

% ghci
ghci> let a *-* b = (a*a) - (b*b)
ghci> :type (*-*)
(*-*) :: (Num a) => a -> a -> a
ghci> 4 *-* 3
7
ghci> 1.2 *-* 0.9
0.6299999999999999
ghci> (*-*) 5 3
16
ghci> :{
          let gcd a b | a > b     = gcd (a - b) b 
                      | b > a     = gcd a (b - a) 
                      | otherwise = a
      :}
ghci> :type gcd
gcd :: (Ord a, Num a) => a -> a -> a
ghci> gcd 3 6
3
ghci> gcd 12 11
1
ghci> 18 `gcd` 12
6

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

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

19
ответ дан 5 December 2019 в 04:30
поделиться

Может быть, Haskell? Позволяет определять произвольные инфиксные операторы.

9
ответ дан 5 December 2019 в 04:30
поделиться

В C ++ вы можете определять операторы, которые работают с другими классами, но я не думаю, что другие примитивные типы, такие как int, поскольку у них не может быть методов экземпляра. Вы можете создать свой собственный числовой класс на C ++ и переопределить ВСЕ операторы, включая + * и т. Д.

Чтобы создать новые операторы для примитивных типов, вам нужно обратиться к функциональному программированию (как видно из других ответов). Это нормально, просто имейте в виду, что функциональное программирование сильно отличается от ООП. Но это будет большой новый вызов, и функциональное программирование отлично подходит для математики, поскольку оно исходит из лямбда-вычисления. Изучение функционального программирования научит вас различным навыкам и очень поможет вам с математикой и программированием в целом. : D

удачи!

3
ответ дан 5 December 2019 в 04:30
поделиться

Eiffel позволяет вам определять новые операторы.

http://dev.eiffel.com

2
ответ дан 5 December 2019 в 04:30
поделиться

Тед Ньюард написал серию статей о Scala, предназначенных для разработчиков Java, и завершил ее демонстрацией того, как написать язык математической предметной области на Scala (который, кстати, является статически типизированным язык)

Часть 1

Часть 2

Часть 3

8
ответ дан 5 December 2019 в 04:30
поделиться

Поскольку процедура, которую вы применяете к аргументам в комбинации Лиспа, называется «оператором», то да, вы можете определить новые операторы, пока коровы не вернутся домой.

2
ответ дан 5 December 2019 в 04:30
поделиться

Ада поддерживает переопределение инфиксных операторов: вот глава справочного руководства .

К сожалению, вы не можете создавать свои собственные новые операторы, кажется, вы можете только переопределить существующие

type wobble is new integer range 23..89;

function "+" (A, B: wobble) return wobble is
begin
   ...
end "+";

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

РЕДАКТИРОВАТЬ:

Другой язык, который еще не был Упомянутое еще есть D . Это также строго типизированный язык, поддерживающий перегрузку операторов . Опять же, он не поддерживает определяемые пользователем инфиксные операторы.

Из http://www.digitalmars.com/d/1. 0 / rationale.html

Почему бы не разрешить определяемые пользователем операторы?

Они могут быть очень полезны для присоединения новых инфиксных операций к различным символам Юникода. Проблема в том, что в D предполагается, что токены полностью независимы от семантического анализа. Определяемые пользователем операторы сломают это.

2
ответ дан 5 December 2019 в 04:30
поделиться

И ocaml, и f # имеют инфиксные операторы. У них есть специальный набор символов, который разрешен в их синтаксисе, но оба могут использоваться для манипулирования другими символами с целью использования любого инфикса функции (см. Обсуждение ocaml ).

2
ответ дан 5 December 2019 в 04:30
поделиться

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

Я могу придумать только одно возможное значение слова «оператор» в этом контексте, которое является просто синтаксическим сахаром для вызова функции, например foo + bar может быть переведено как вызов функции + (a, b) .

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

Как отмечалось в других ответах, Haskell действительно позволяет вам определять новые инфиксные операторы. Однако чисто функциональный язык с ленивым вычислением может показаться неприятным. Я бы, наверное, порекомендовал SML вместо Haskell, если вам хочется впервые попробовать функциональный язык. Система типов немного проще, вы можете использовать побочные эффекты и не ленитесь.

F # также очень интересен, а также содержит единиц измерения , которые AFAIK уникальны для этого языка. Если вам нужна эта функция, она может оказаться неоценимой.

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

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

вы можете использовать побочные эффекты, и это не лениво.

F # также очень интересен, а также содержит единиц измерения , которые AFAIK уникальны для этого языка. Если вам нужна эта функция, она может оказаться бесценной.

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

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

вы можете использовать побочные эффекты, и это не лениво.

F # также очень интересен, а также имеет единиц измерения , которые AFAIK уникальны для этого языка. Если вам нужна эта функция, она может оказаться бесценной.

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

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

который AFAIK уникален для этого языка. Если вам нужна эта функция, она может оказаться неоценимой.

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

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

который AFAIK уникален для этого языка. Если вам нужна эта функция, она может оказаться неоценимой.

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

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

поскольку гораздо проще доказать факты о функциональной программе.

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

поскольку гораздо проще доказать факты о функциональной программе.

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

1
ответ дан 5 December 2019 в 04:30
поделиться

Вы действительно можете делать то, что вам нужно, с помощью C # с помощью перегрузки оператора.

Пример:

 public static Complex operator -(Complex c)
 {
    Complex temp = new Complex();
    temp.x = -c.x;
    temp.y = -c.y;
    return temp;
 }

0
ответ дан 5 December 2019 в 04:30
поделиться

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

Я бы пошел с Common Lisp. На самом деле в нем нет операторов (например, добавление a и b равно (+ ab) ), а скорее функций, которые можно определять свободно. Он имеет строгую типизацию: каждый объект имеет определенный тип, даже если он не может быть известен во время компиляции, а преобразования ограничены. Это действительно отличный язык для исследовательского программирования, и похоже, что вы этим и будете заниматься.

1
ответ дан 5 December 2019 в 04:30
поделиться

Ruby делает.

require 'rubygems'
require 'superators'

class Array
  superator "<---" do |operand|
    self << operand.reverse
  end
end

["jay"] <--- "spillihp"
1
ответ дан 5 December 2019 в 04:30
поделиться

Ну, вы можете переопределить фиксированный набор операторов во многих языках, например C ++ или C # . Другие,

10
ответ дан 5 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: