Recent Changes · Search:

Functional Programming

Type Inference

Toss

  • (incorporates former Speagram)

Emacs

Kurs Pascala

Artificial General Intelligence

AI:

Algorithmic Game Theory: Prediction Markets (po polsku)

Programming in Java

kurs pracy w systemie Linux

Evolutionary Algorithms

Animation

Data Stores and Data Mining

Language Understanding

Systemy Inteligentnych Agentów

Przetwarzanie Języka Naturalnego

Programowanie Funkcjonalne

PmWiki

pmwiki.org

add user

edit SideBar

Powiedzmy, że rozwiązując zadanie z31 postanowiliśmy podawać “stałe” literały przez referencje, żeby można je było później zmieniać. Wykorzystanie efektów ubocznych pozwala podpatrzeć tzw. strategię obliczeń.

let ( $$ ) f g x = f (g x);;
let lit const cont acc = cont (acc ^ !const);;
let int cont acc arg = cont (acc ^ (string_of_int arg));;
let format pf = pf (fun s -> s) "";;
let s = ref ", ";;
let t = format (int $$ lit s $$ int) 5;;
t 7;;
s := "; ";;
t 7;;

Wbrew naszym oczekiwaniom, w obu przypadkach liczby są rozdzielone przecinkiem. Co się stało? Funkcja lit została policzona już w momencie definicji t. Przed wywołaniem format nie jest jeszcze nic policzone, bo złożenia $$ wymagają trzech argumentów, a dostają za każdym razem dwa. Jednak format zostaje policzony, bo dostaje wszystkie swoje argumenty tzn. jeden argument. W pierwszym kroku obliczania format zostają policzone złożenia ($$ dostaje brakujący argument): wynikiem pf (fun s -> s) "" jest int ((lit s) (int (fun s -> s))) "". lit ma w tej chwili dwa z trzech argumentów, więc ciągle nie jest policzony, podobnie int. Natomiast po “wyjściu” z format, int dostaje trzeci argument, więc w następnym kroku jest obliczany. Krokiem pośrednim tego obliczenia jest ((lit s) (int (fun s -> s))) "5". Teraz widać, że lit ma już wszystkie trzy argumenty, i w kolejnym kroku zostaje policzony.

Edit · History · Print · Recent Changes · Search · Links
Page last modified on January 10, 2007, at 01:16 AM