2009-07-26 9 views
7

Actualmente estoy buscando un lenguaje de programación para escribir una clase de matemáticas. Sé que hay muchas y muchas en todas partes, pero como voy a comenzar a estudiar matemáticas el próximo semestre, pensé que podría ser una buena forma de obtener una visión más profunda de lo que he aprendido.¿Hay un lenguaje de programación fuertemente tipado que le permita definir nuevos operadores?

Gracias por sus respuestas.

Por cierto: Si usted se está preguntando lo que quería preguntar: "¿Hay un lenguaje de programación fuertemente tipado que le permite definir nuevos operadores"

+0

Definir "operador". – Svante

+2

'Operador' es un término bastante bien definido. –

Respuesta

19

Like EFraim said, Haskell hace que este muy fácil:

 
% 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 

Se pueden definir nuevos operadores infijos (sólo símbolos) utilizando una sintaxis infija. A continuación, puede usar como operadores de infijo, o incluirlos en parens para usarlos como una función normal.

También puede usar las funciones normales (letras, números, guiones bajos y comillas simples) como operadores encerrándolas en los puntos atrás.

+0

¿te permite jugar con la precedencia? – skaffman

+2

¡Sí! Use 'infixr' y' infixl': http://www.zvon.org/other/haskell/Outputsyntax/fixityQdeclaration_reference.html – rampion

9

¿Tal vez Haskell? Le permite definir operadores de infijo arbitrarios.

10

Bueno, puede redefinir un conjunto fijo de operadores en muchos idiomas, como C++ o C#. Otros, como F# o Scala, le permiten definir incluso operadores nuevos (incluso infijos) que podrían ser incluso mejores para cosas de matemáticas.

8

Ted Neward escribió una serie de artículo sobre Scala dirigido a los desarrolladores de Java, y él terminó mediante la demostración de cómo escribir un lenguaje de dominio matemático en Scala (que, por cierto, es un lenguaje de tipo estático)

Part 1

Part 2

Part 3

+1

Creo que una desventaja de Scala sería la imposibilidad de redefinir la precedencia y la asociatividad. Estos son fijos (definidos por el primer y el último carácter del nombre del método). –

+0

Sí, eso huele un poco. – skaffman

3

en C++ se pueden definir los operadores que trabajan en otras clases, pero no creo que otros tipos primitivos como porque no pueden tener métodos de instancia. Puede crear su propia clase numérica en C++ y redefinir TODOS los operadores, incluidos + *, etc.

Para crear nuevos operadores en tipos primitivos, debe recurrir a la programación funcional (parece que de las otras respuestas). Esto está bien, solo tenga en cuenta que la programación funcional es muy diferente de OOP. Pero será un gran desafío nuevo y la programación funcional es genial para las matemáticas ya que viene de lambda calc. El aprendizaje de la programación funcional le enseñará diferentes habilidades y le ayudará mucho con las matemáticas y la programación en general. : D

buena suerte!

2

Ada tiene soporte para sobrescribir los operadores infijos: aquí está el reference manual chapter.

Desafortunadamente no puede crear sus propios operadores nuevos, parece que solo puede anular los existentes.

type wobble is new integer range 23..89; 

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

Ada no es un lenguaje muy popular, tiene que ser dicho, pero en lo que va tipado fuerte, no se puede conseguir mucho más fuerte.

EDIT:

otro idioma que no se ha mencionado todavía es D. También es un lenguaje fuertemente tipado y admite operator overloading. De nuevo, no es compatible con operadores de infijo definidos por el usuario.

De http://www.digitalmars.com/d/1.0/rationale.html

Por qué no permite que los operadores definidos por el usuario?

Estos pueden ser muy útiles para adjuntar nuevas operaciones infija a varios símbolos Unicode. El problema es que en D, se supone que los tokens son completamente independientes del análisis semántico. Los operadores definibles por el usuario romperían eso.

2

En la medida en que el procedimiento que aplica a los argumentos en una combinación de Lisp se denomina "operador", entonces sí, puede definir nuevos operadores hasta que las vacas vuelvan a casa.

1

Creo que probablemente deba pensar detenidamente acerca de por qué quiere usar esta función. Me parece que hay consideraciones mucho más importantes al elegir un idioma.

Solo puedo pensar en un posible significado para la palabra "operador" en este contexto, que es solo azúcar sintáctica para una llamada de función, p. foo + bar se traduciría como una llamada a una función +(a, b).

Esto a veces es útil, pero no a menudo. Puedo pensar en muy pocos casos en los que he sobrecargado/definido un operador.

Como se menciona en las otras respuestas, Haskell le permite definir nuevos operadores de infijo. Sin embargo, un lenguaje puramente funcional con evaluación perezosa puede ser un poco agotador. Probablemente recomendaría SML en vez de Haskell, si te apetece probar un lenguaje funcional por primera vez. El sistema de tipo es un poco más simple, puedes usar efectos secundarios y no es flojo.

F # también es muy interesante y también cuenta con units of measure, que AFAIK es exclusivo de ese idioma. Si necesita una característica, puede ser invaluable.

En la parte superior de mi cabeza no puedo pensar en ningún lenguaje imperativo con operadores de infijo, pero es posible que desee utilizar un lenguaje funcional para la programación matemática de todos modos, ya que es mucho más fácil probar datos sobre un funcional programa.

Es posible que también desee crear una pequeña DSL si los problemas de sintaxis como los operadores de infijo son tan importantes para usted. Luego puede escribir el programa en el idioma que desee y aún así especificar las matemáticas de una manera conveniente.

+0

La biblioteca de impulso de C++ "Unidades" proporciona análisis dimensional en tiempo de compilación similar a las unidades de medida F #. –

2

Tanto ocaml como f# tienen operadores de infijo. Tienen un conjunto especial de caracteres que están permitidos dentro de su sintaxis, pero ambos se pueden usar para manipular otros símbolos para usar cualquier infijo de función (ver ocaml discussion).

0

En realidad, puede hacer lo que necesita con C# mediante la sobrecarga del operador.

Ejemplo:

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

+0

Sí, eso es correcto, pero no puede definir nuevos operadores, por lo que está limitado a +, -, *, /, los operadores de comparación y algunos más. Pero, ¿y si tienes dos juegos y quieres obtener la unión de los dos? ¿Realmente debería ir y definir una función estática set.union (setA, setB)? – niklasfi

1

¿Qué quiere decir con tipos fuertes? ¿Quiere decir tipado estático (donde todo tiene un tipo que se conoce en tiempo de compilación y las conversiones son restringidas) o tipeo fuerte (todo tiene un tipo conocido en tiempo de ejecución y las conversiones están restringidas)?

Me gustaría ir con Common Lisp. En realidad, no tiene operadores (por ejemplo, agregar ayb es (+ a b)), sino más bien funciones, que se pueden definir libremente. Tiene un tipado fuerte en el sentido de que cada objeto tiene un tipo definido, incluso si no puede conocerse en tiempo de compilación, y las conversiones están restringidas. Es un lenguaje realmente genial para la programación exploratoria, y parece que eso es lo que harás.

1

Ruby does.

require 'rubygems' 
require 'superators' 

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

["jay"] <--- "spillihp" 
Cuestiones relacionadas