Loading AI tools
linguagem de programação Da Wikipédia, a enciclopédia livre
Standard ML (SML) é uma linguagem de programação funcional de propósito geral modular com verificação e inferência de tipos em tempo de compilação. É popular entre pesquisadores de linguagem de programação e compiladores.
Standard ML | |
---|---|
Paradigma | Multiparadigma: |
Surgido em | 1983 (40–41 anos) |
Última versão | SML '97 (1997 | )
Estilo de tipagem |
|
Dialetos |
|
Influenciada por | ML |
Influenciou | Rust |
Extensão do arquivo | .sml |
SML é uma descendente moderno da linguagem ML utilizada em lógica de funções computáveis (LCF). Distingue-se das outras linguagens utilizadas atualmente devido sua característica funcional e devido sua especificação formal, dado como escrever regras e semântica operacional na definição da Standard ML. [1]
Standard ML é uma linguagem de programação funcional com algumas características impuras. Softwares escritos em SML consistem de expressões a serem avaliadas, ao contrário de declarações ou comandos, apesar de algumas expressões de retorno de uma unidade de "trivial" valor e apenas são avaliados por seus efeitos colaterais.
Como toda linguagem de programação funcional, uma característica fundamental do SML é função, que é usada para a captação. Por exemplo, a função fatorial pode ser expresso como:
fun factorial n =
if n = 0 then 1 else n * factorial (n - 1)
Um compilador SML é requirido para inferir o tipo estático int -> int desta função fornecida pelo usuário, sem anotação de tipo. Ou seja, tem a deduzir que n"" só é usado com expressões inteiro, e deve, portanto, por si só, um número inteiro, e que todas expressões produzem expressões com funções retornando inteiros.
A mesma função pode ser expressa com as definições em que as condicionaisif-then-else são substituídas por uma seqüência de "templates" da função fatorial avaliados para valores específicos, separados por "|", que são avaliados um por um na ordem escrita até que seja encontrada uma correspondência:
fun factorial 0 = 1
| factorial n = n * factorial (n - 1)
Isto pode ser reescrito usando uma instrução, num caso similar como este:
val rec factorial =
fn n => case n of 0 => 1
| n => n * factorial (n - 1)
ou como uma função lambda:
val rec factorial = fn 0 => 1 | n => n * factorial(n - 1)
Aqui, a palavra-chave val
introduz uma ligação de um identificador para um valor, fn
apresenta a definição de uma função função anônima, e case
introduz uma seqüência de padrões e expressões correspondentes.
Usando uma função local, esta função pode ser reescrita de forma mais eficiente de estilo tail recursive.
fun factorial n = let
fun lp (0, acc) = acc
| lp (m, acc) = lp (m - 1, m * acc)
in
lp (n, 1)
end
(O valor de uma expressão let
é o da expressão entre in
e end
.) O encapsulamento de uma invariante preservando cauda-do-loop apertado recursivamente com um ou mais parâmetros acumuladores dentro de uma função externa invariável-livre, como pode ser visto aqui, é uma expressão comum em SML, e aparece com grande frequência no código SML.
O tipo sinônimo é definido com a palavra reservada type
. Aqui é um tipo sinônimo para pontos no plano, e as funções de computação das distâncias entre dois pontos e a área de um triângulo com cantos dada pela fórmula de Heron.
type loc = real * real
fun dist ((x0, y0), (x1, y1)) = let
val dx = x1 - x0
val dy = y1 - y0
in
Math.sqrt (dx * dx + dy * dy)
end
fun heron (a, b, c) = let
val ab = dist (a, b)
val bc = dist (b, c)
val ac = dist (a, c)
val perim = ab + bc + ac
val s = perim / 2.0
in
Math.sqrt (s * (s - ab) * (s - bc) * (s - ac))
end
Existem muitas implementações SML, incluindo:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.