Quali sono / sarebbero le caratteristiche e le applicazioni di un paradigma di programmazione in cui le funzioni non possono avere istruzioni?

1

Supponiamo che esista un linguaggio in cui, invece delle istruzioni, le funzioni potrebbero essere definite solo in relazione ad altre funzioni e operatori come l'applicazione parziale e la composizione. Quali sarebbero le caratteristiche di tale linguaggio? Tutto ciò che viene fatto con le affermazioni può essere fatto su questo disegno? Quali sarebbero i limiti? Ci sono lingue come questa?

    
posta MaiaVictor 14.06.2012 - 01:45
fonte

2 risposte

5

Ho usato un linguaggio del genere. Ha kell .

È completo da Turing ed è stato utilizzato per scrivere applicazioni aziendali di grandi dimensioni.

Anche se le funzioni di Haskell non dovrebbero avere effetti collaterali, ce ne sono molte che funzionano e si comportano in modo molto simile alle dichiarazioni. (Questi sono ovviamente necessari per fare qualsiasi cosa.) Ad esempio, ecco un esempio Hello World da Wikipedia:

module Main where

main :: IO ()
main = putStrLn "Hello, World!"
    
risposta data 14.06.2012 - 02:20
fonte
4

Non è del tutto chiaro cosa stai chiedendo qui. I concetti di "funzione" e "istruzione" sono reciprocamente incompatibili: una funzione è una subroutine che restituisce un valore, non ha effetti collaterali e è referenzialmente trasparente, mentre una istruzione non ha un valore e quindi deve necessariamente avere un effetto collaterale e quindi non può essere referenzialmente trasparente.

Quindi, una funzione può mai essere definita in termini di dichiarazioni, solo in termini di espressioni.

Quindi, sì, ci sono linguaggi in cui le funzioni non possono contenere istruzioni, vale a dire tutti i linguaggi di programmazione funzionale. Questi non hanno nemmeno hanno dichiarazioni.

Haskell è un buon esempio. (Nota: Haskell in effetti ha ha dichiarazioni, ma non al livello del calcolo effettivo.Ad esempio, l'importazione del modulo è un'istruzione o la definizione di un tipo.Tuttavia, questi sono costrutti di tempo di compilazione, non costrutti di esecuzione , quindi, l'idea di "restituire un valore" non ha nemmeno senso comunque.)

Nota, ci sono anche molte lingue che non sono linguaggi funzionali che tuttavia non hanno dichiarazioni, ad es. Ruby, Io, Ioke, Seph, Smalltalk, Self, Newspeak, Schema.

Oppure, stai parlando di programmazione combinando le funzioni? Poi, ancora, sì, questo esiste, ed è chiamato "programmazione funzionale". Nella programmazione funzionale, si costruiscono programmi usando le funzioni come principale (e solo!) Strumento di costruzione e strutturazione, combinandole e manipolandole. Esistono anche dei linguaggi in cui le funzioni sono le primitive solo fornite dal linguaggio. Ancora una volta, Haskell, è un esempio. Ha cose come valori letterali numerici (ad esempio 1 ), ma puoi interpretarli come funzioni null.

Naturalmente, la manifestazione originale di questa idea è lambda calcolo.

Ci sono anche lingue in cui non anche hanno funzioni, solo solo hanno combinatori. Unlambda è un tale linguaggio, che come suggerisce il nome è uno dei pochissimi linguaggi di programmazione funzionale che non si basa sul calcolo lambda. Invece, si basa sul calcolo del combinatore SKI.

Il calcolo del combinatore SKI ha solo tre primitive: il combinatore S, il combinatore K e il combinatore I. (In realtà, si scopre che il combinatore I può essere espresso come SKK, quindi non è davvero primitivo, puoi cavartela solo con S e K.) Non ha alcun tipo di dati: nessun valore di booleana, nessun numero, no niente. (Proprio come il lambda calcolo). Tuttavia, a differenza del lambda calcolo, non ha, beh, lambda (cioè funzioni) né variabili. Eppure, è un modello di calcolo completo di Turing che in realtà precede anche sia le macchine di Turing che il Lambda Calculus.

    
risposta data 14.06.2012 - 02:40
fonte