Funktionell programmering/Paradigm Flashcards

1
Q

Vad är imperativ programmering?

A

Imperativ programmering:
Programmet har ett tillstånd (state), och programmet
har instruktioner för hur tillståndet ska manipuleras
steg för steg för att nå slutresultatet. Ex Java, Go, Assembler, C o.s.v.

En sekvens av satser som beskriver hur datorn ska bygga upp ett state (tillstånd).

Subprogram (kallas subrutiner i assembler) anropas med hopp (jump och branch, exempel jsr, beq, bne i assembler, goto i C och BASIC) och utan parametrar. Först modifieras programmets state för att hantera anropet, resultatet av beräkningarna levereras genom bieffekter på globala variabler.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Vad är funktionell programmering?

A

En typ av deklarativ programmering där resultatet av beräkningar beskrivs som värdet av (matematiska) funktioner.

  1. Vi har immutability, rena funktioner, funktioner som första klassens medlemmar. Referenstransparens följer av (se punkt 2).
  2. Vi har inte destruktiv tilldelning eller bieffekter av funktionsanrop.
  3. Bakomliggande antaganden: Vi vill arbeta med uttryck och symboler, inte detaljer om hur datorn fungerar.

De funktionella språken heter Lisp, Erlang, Haskell och Clojure. Ett språk som är fullt ut funktionellt men också tillåter flera imperativa paradigm är Scala. Funktionellt inspirerad syntax och språkkonstruktioner finns i C++, C#, Java, Javascript, Python med flera.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Vad är logikprogrammering?

A

Villkorsprogrammering (Constraint Programming) går ut på att speca villkoren för en beräkning och sedan låta språket räkna ut svaret själv.

Logisk programmering är ett deklarativt paradigm.
Främsta (och enda exemplet i kursen) är Prolog

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Vad är deklarativ programmering?

A
Deklarativ programmering (motsatsen till Imperativ programmering):
Koden definierar vad slutresultatet ska vara, inte hur det ska uppnås och är samlingsnamnet för funktionell programmering och logikprogrammering. 

I programmeringsstil anger programmeraren vad som ska göras, inte hur beräkningen ska gå till. Man beskriver inget exekveringsflöde. I princip kan instruktionerna anges i vilken ordning som helst. Man strävar också efter att undvika sidoeffekter.

I deklarativ programmering defnierar man vad
saker är och de kan inte ändra värde.
Instruktionerna har inga sido-effekter .
——————————————————————————
Programmen beskriver vad som ska beräknas, inte hur det ska beräknas.

Om något definitivt inte är imperativt så är det deklarativt.

Deklarativ programmering undviker bieffekter.

Referenstransparens innebär att varje uttryck kan ersättas med sitt värde utan att förändra resultatet!

Deklarativa paradigmer: Funktionella, logiska,

Exempel på deklarativt språk: SQL (databasförfrågningar)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Vad innebär referenstransparens/referential transparency?

A
  • ## Full referential transparaency i en fil eller ett metodanrop betyder att ett namn alltid är samma sak. (Funktionell programmering)An expression is called referentially transparent if it can be replaced with its corresponding value without changing the program’s behavior.[1] This requires that the expression is pure, that is to say the expression value must be the same for the same inputs and its evaluation must have no side effects. An expression that is not referentially transparent is called referentially opaque.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Vad är lat evaluering?

A
  • Lazy evaluation is a method to evaluate a Haskell program. It means that expressions are not evaluated when they are bound to variables, but their evaluation is deferred until their results are needed by other computations. (Haskell wiki)
  • In programming language theory, lazy evaluation is an evaluation strategy which delays the evaluation of an expression until its value is needed (non-strict evaluation) and which also avoids repeated evaluations (sharing). (Wikipedia)

Lat evaluering i Haskell:
•”Beräkna bara det som behövs”
• Varje uttryck lagras som ett löfte om evaluering — vid behov. Räknas högst en gång.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Vad innebär det med “inga sidoeffekter”?

A

När en funktion som anropas med samma värde två gånger ger det alltid samma resultat.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Vad innebär Svansrekursion?

A

Rekrusion
- Man har ett basfall och låter en funktion anropa sig själv så att den steg för steg går mot basfallet och bygger upp svaret.

Det är en Svansrekursion om det rekursiva anropet returnerar direkt utan några kvarhängade operationer från tidigare anrop.

  • Svansrekursion är inom datavetenskap en speciell sorts rekursion då sista operationen i en funktion är ett rekursivt anrop. (Wikipedia)
  • In tail recursion, you perform your calculations first, and then you execute the recursive call, passing the results of your current step to the next recursive step. This results in the last statement being in the form of (return (recursive-function params)). Basically, the return value of any given recursive step is the same as the return value of the next recursive call. (Stack overflow)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Vad innebär det med polymorfism/polymorphism?

A

Det finns flera typer av polymorphism tre av de är:
• Ad hoc polymorphism -
Också känd som “method overloading” och “operator overloading”. Vilket är när man kan använda samma metod namn eller operator för olika typer. Beroende på vilken typ av input man hade så får man olik output.

“ad-hoc polymorphism is bound to a type. Depending on the type, different implementations of the method are invoked.”

“Ad-hoc polymorphismusually refers to code that appears to be polymorphic to the programmer, but the actual implementation is not. A typical example is overloading: using the same function name for functions with different kinds of parameters. Although it looks like a polymorphic function to the code that uses it, there are actually multiple function implementations (none being polymorphic) and the compiler invokes the appropriate one.”

• parametric polymorphism -

“Parametric polymorphism allows the use of a single abstraction across many types. For example, a List abstraction, representing a list of homogeneous objects, could be provided as a generic module. You would reuse the abstraction by specifying the types of objects contained in the list.”

“Parametric polymorphism refers to code that is written without knowledge of the actual type of the arguments; the code is parametric in the type of the parameters. Example generics in Java 5”

“Parametric polymorphism refers to when the type of a value contains one or more (unconstrained) type variables, so that the value may adopt any type that results from substituting those variables with concrete types.

In Haskell, this means any type in which a type variable, denoted by a name in a type beginning with a lowercase letter, appears without constraints (i.e. does not appear to the left of a =>). In Java and some similar languages, generics (roughly speaking) fill this role.

For example, the function id :: a -> a contains an unconstrained type variable a in its type, and so can be used in a context requiring Char -> Char or Integer -> Integer or (Bool -> Maybe Bool) -> (Bool -> Maybe Bool) “

• subtyping polymorphism -
“Subtype polymorphism gives a single term many types using the subsumption rule. For example, a function with argument τ can operate on any value with a type that is a subtype of τ”

“Object-oriented programming languages offer subtype polymorphism using subclassing (also known as inheritance).”

"Subtype Polymorphism – is that we have because of inheritance (When we inherit from some class, in the method signature it is possible to write superclass and put there any subclass)."
---------------------------------------------------------------------------------------
In programming languages and type theory, polymorphism is the provision of a single interface to entities of different types or the use of a single symbol to represent multiple different types.

The most commonly recognised major classes of polymorphism are:

  • Ad hoc polymorphism: defines a common interface for an arbitrary set of individually specified types.
  • Parametric polymorphism: when one or more types are not specified by name but by abstract symbols that can represent any type.
  • ## Subtyping: when a name denotes instances of many different classes related by some common superclass(polymorphism) – i programmering: det att en och samma instruktion i ett programspråk kan utföras på olika sätt. Vilket sätt som väljs avgörs av sammanhanget.
    – Termen används främst inom objekt­orien­te­rad pro­gram­mering, och innebär där att en och samma metod utförs på olika sätt i olika klasser av objekt. Detta är möjligt i objektorienterade program därför att koden som beskriver hur ett anrop ska utföras ingår i objektet, inte i anropet. Anropet anger bara namnet på metoden och vilka argument som ingår
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Polymorf funktion?

A

Kan tillämpas på flera typer.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Polymorf typ?

A

”Kan anta flera former” .

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Haskells olika typklasser?

A
  • Num – Alla numeriska typer
  • Ord – Alla ordnade typer (<=)
  • Eq – Alla jämförbara typer (==)
  • Show – Typer med skrivbara element
  • Read – Typer med läsbara element
  • Integral – Heltalstyper: Int, Integer
  • Fractional – ex. Float, de som stödjer division.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Vad är överlagring (overloading)?

A

• Samma funktion definierad på olika argument
T.ex.: Addition (+) på Int är inte samma som addition på Float.

Metod överlagrind/ Function overloading:

In some programming languages, function overloading or method overloading is the ability to create multiple functions of the same name with different implementations. Calls to an overloaded function will run a specific implementation of that function appropriate to the context of the call, allowing one function call to perform different tasks depending on context.

For example, doTask() and doTask(object O) are overloaded functions. To call the latter, an object must be passed as a parameter, whereas the former does not require a parameter, and is called with an empty parameter field. A common error would be to assign a default value to the object in the second function, which would result in an ambiguous call error, as the compiler wouldn’t know which of the two methods to use.

  • The same function name is used for more than one function definition
  • The functions must differ either by the arity or types of their parameters

It is a classification of static polymorphism in which a function call is resolved using some “best match” algorithm, where the particular function to call is resolved by finding the best match of the formal parameter types with the actual parameter types. The details of this algorithm vary from language to language.
———————————————————————————–
Operator overloading:

In programming, operator overloading, sometimes termed operator ad hoc polymorphism, is a specific case of polymorphism, where different operators have different implementations depending on their arguments. Operator overloading is generally defined by a programming language, a programmer, or both.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Överlagring i Haskell?

A
  • Explicit överlagring
  • Skapa en klass som beskriver gemensamma egenskaper
  • Visa hur överlagringen hanteras för olika typer
T.ex:
•Från Prelude.hs: 
class Eq   a where
 (==) :: a -> a ->  Bool
 (/=) :: a -> a ->  Bool 

•Också från Prelude.hs:
instance Eq Integer where
x == y = integerEq x y

•Tala om att din klass tillhör Eq:
instance Eq MinKlass where
x == y = minEq x y

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Arv hos typklasser (Haskell)?

A

•Definiera ordnade typer:
class Eq a => Ord a where
( a -> Bool
(>=), (>) :: a -> a -> Bool

•”Alla Ord-typer måste vara Eq-typer också.”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Funktionell programmering (typer/klasser) jämfört med objektorienterad programmering?

A

Likheter
• Klasser och arv
• Klasser samlar funktioner
• Standardmetoder

Skillnad
• Inga objekt, inga attribut
• Två sorts polymorfism: Parametrisk och ad hoc
• Alla metoder är statiskt bestämda, ingen klassinformation i data
• Åtkomstkontroll (public, private) indirekt via modulsystem

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Haksell och typkonvertering?

A

I många språk blir det automatiskt typkonvertering, men i haskell har man explicit typkonvertering.

Man måste alltså ange , t.ex:
fromIntegral(length(lista))/ 10 för om man skippar att ta “fromIntegral” får man en typfel error.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Definiera egna datastrukturer?

A

Java, C++, etc: Klasser

Haskell: data
Exempel:
data Bool = True | False
data Address = None | Addr String

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Vad är algebraiska datatyper?

A

•En typ ”komponerad” av andra typer, var och en med en konstruktor, kallas algebraisk.

•Obs: En produkttyp har endast en konstruktor.
Ex: data Color = RGB Int Int Int

•Obs: En enumererad typ listar konstruktorer utan argument.
Ex: data Bool = True | False

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Typer i olika språk?

A

Statisk typning - Typen begränsar variabeln:
int i := 17 —- Används i Java, Haskell, etc.

Dynamisk typning -Beskriver värdet:
Tänk: i := 17 —- Används i Lisp, MatLab, Perl, etc

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Typkonvertering (implicit och explicit)?

A

Implicit konvertering:
float x = 3.5;
int i = x;

Explicit konvertering:
float x = 3.5;
int i = (int) x;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Stark och svag typning?

A
  • Oklara begrepp. Avser hur starkt språketbegränsar tolkningen av värden.
  • Sebesta: ”strongly typed if all type errors are always detected.”
  • ”Ada, Java, and C# are nearly strongly typed”

Exempel:
•Tc l: Alla variabler kan tolkas som strängar.

  • Perl: Listvariabel kan tolkas som listlängd, beroende på sammanhang. En lista kan tolkas som en associativ array (hashtabell).
  • C: Automatisk typkonvertering (casting) mellan flera inbyggda typer. Union kan ej typkontrolleras.
  • C++: Skriv dina egna automatiska konverteringsregler.
  • Haskell: Ingen automatisk typkonvertering.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Säkra typsystem?

A
  • Def: Ett typsystem är säkert om det garanterar att inga uttryck kan anta värden som inte är definierade av typen.
  • Osäkert språk: C
  • Säkra språk: Haskell, Ada(?)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Högre ordningens funktion?

A

En funktion är en högre ordningens funktion om:
- den tar en eller flera funktioner som argument
eller
- returnerar en funktion
eller
- båda ovanstående

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Funktionskomposition (högre ordningens funktion)?

A

•I matte: f ◦ g ”sammanfogar” f och g.
Dvs f ◦ g(x) = f (g(x))

•I Haskell: (f . g) x

•Kräver alltså att
g :: a -> b
f :: b -> c

Exempel:
twice :: (a -> a) -> (a -> a)
twice f = f . f

kvadrat x = x*x

*Main> twice kvadrat 2 16

I Haskell använder man symbolen (.) punkt.
Ex:
fn x = ceiling (negate (tan (cos (max 50 x))))
<=> fn = ceiling . negate . tan . cos . max 50

The primary purpose of the . operator is not to avoid parentheses, but to chain functions. It lets you tie the output of whatever appears on the right to the input of whatever appears on the left. This usually also results in fewer parentheses, but works differently.

But the $ operator is for avoiding parentheses. Ex:
putStrLn (show $ 1 + 1) <=>
putStrLn $ show (1 + 1) <=>
putStrLn $ show $ 1 + 1 <=>

  1. (1 + 1) doesn’t have an input, and therefore cannot be used with the . operator.
  2. But you can chain show to putStrLn like this:
    (putStrLn . show) (1 + 1)
26
Q

Vad är lambada kalkyl/lambda calculus?

A

Lambda calculus (also written as λ-calculus) is a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. It is a universal model of computation that can be used to simulate any Turing machine. It was first introduced by mathematician Alonzo Church in the 1930s as part of his research of the foundations of mathematics.

Lambda calculus consists of constructing lambda terms and performing reduction operations on them. In the simplest form of lambda calculus, terms are built using only the following rules:

Syntax Name Description
x Variable A character or string representing a parameter or mathematical/logical value

(λx.M) Abstraction Function definition (M is a lambda term). The variable x becomes bound in the expression.

Lambda-kalkylen är ett sätt att beskriva funktioner så att de kan hanteras mekaniskt. Lambda-kalkylen kan alltså för de funktionella språken jämföras med automatateorin för imperativa.

Lambdakalkylen ger också en beskrivning av begreppen beräkning och beräkningsordning.

Grundläggande i lambdakalkylen är tre regler för förenkling/beräkning, alfa, beta och eta-reglerna. Med vissa val av representationer, om alla objekt, även de naturliga talen, avbildas på funktioner, kan alla beräknningar utföras med dessa tre regler.

27
Q

Lambadakalkyl i Haskell?

A

Man kan betrakta funktioner i Haskell som uppbyggda mhja λ-notation dvs
addera = \x y -> x + y

*Main> :t addera
addera :: Integer -> Integer -> Integer

28
Q

Vad är currying?

A

Funktioner som tar ett argument och returnerar en ny funktion kallas Curried functions

Currying är en princip i Haskell:
Alla funktioner tar alltid en parameter och returnerar ett värde eller en ny funktion.

Så när vi skriver funktioner som tar “mer än en parameter”
ex: funct:: a -> a -> a , då är det curried funktioner.

Ett exempel är max 4 5, det ser ut som om man tar två parameterar och returner den som är störst. Men det som egentligen händer är att max 4 5 först skapar en funktion som tar en parameter och returnerar antingen 4 eller den parametern, beroende på vilken som är större. Sen är 5 applicerad till den funktionen och det skapar vår önskade resultat.

D.v.s dessa två är likadana: 
ghci> max 4 5 
5
ghci> (max 4) 5 
5

Att lägga mellanrum mellan två input värden är helt enkelt funktions applikation/function application. Mellanrummet är som en operatör med högsta prioritet. Ex. typen till “max”:
max :: (Ord a) => a -> a -> a, kan också skrivas som
max :: (Ord a) => a -> (a -> a).
Alltså max tar ett input a och returnerar en funktion som tar ett input a och returnerar ett a.
————————————————————————————-
In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments into evaluating a sequence of functions, each with a single argument. For example, a function that takes two arguments, one from X and one from Y, and produces outputs in Z, by currying is translated into a function that takes a single argument from X and produces as outputs functions from Y to Z. Currying is related to, but not the same as, partial application. (Wikipedia)

29
Q

Vad är en datatyp?

A

In computer science and computer programming, a data type or simply type is an attribute of data which tells the compiler or interpreter how the programmer intends to use the data. Most programming languages support common data types of real, integer and boolean. A data type constrains the values that an expression, such as a variable or a function, might take. This data type defines the operations that can be done on the data, the meaning of the data, and the way values of that type can be stored. A type of value from which an expression may take its value. (Wikipedia)

30
Q

Anonyma funktioner?

A

Kan använda lambda-notationen för att skapa icke namngivna funktioner.

An anonymous function is a function without a name. It is a Lambda abstraction and might look like this: \x -> x + 1.

31
Q

Exempel på reverse av en lista haskell?

A

reverse1 xs = foldr snoc [] xs

snoc x xs = xs ++ [x]

32
Q

Funktioners egenskaper i Haskell?

A
  • Har samma ”rättigheter” som andra värden.
  • Behöver inte namnges, anonym
  • Nya funktioner från gamla, currying
  • Kan ges som argument
  • Kan returneras som värde
  • Kan lagras i datastrukturer
33
Q

Strikt och icke strikt evaluering?

A

Strikt evaluering
Def: Strikt evaluering innebär att alla parametrars värde är kända när en operator eller funktion anropas.
Ex: Funktionsanrop i Java, C, etc

Icke-strikt evaluering
Hur beräknas
• if   jobbigt(17) &amp;&amp; tungt(4711) then ...? 
Vanligen: Man ”kortsluter” jämförelsen. 
Implementeras för and och or
34
Q

För -och nackdelar med lat evaluering?

A

Nackdelar:

  • Kan slöa ner ett program (använd då explicit strikt evaluering!)
  • Kan slösa på minne: ”löftet” tar plats
  • Överraskande för den ovetande?

Fördelar:

  • Kan snabba upp ett program
  • Undviker onödiga beräkningar.
  • Automatiskt!
  • Erbjuder smarta uttryckssätt.
35
Q

Generella egenskaper hos funktionell programmering?

A
  • Variabler - Nej!
  • Tilldelning - Nej!
  • Sidoeffekter - Nej!
  • Pekare, referenser - Nej!
  • Skräpsamling - Ja! (garbage collection)
36
Q

Haskells egenskaper?

A
  • Strikt funktionellt. Inget ‘‘fusk’’ med tilldelning.
  • Starkt typsystem. Hittar många fel tidigt, stödjer kodning.
  • Typklasser. Överlagrade funktioner kodåtervinning, god abstraktion.
  • Lat evaluering. Beräkna bara det som behövs. •Funktioner är ‘‘first class’ ’. Behandlas som vilka värden som helst.
  • Moduler. Storskalig programutveckling, goda bibliotek.
37
Q

Vad är en ren funktion/pure function?

A

In computer programming, a pure function is a function that has the following properties:

  1. Its return value is the same for the same arguments (no variation with local static variables, non-local variables, mutable reference arguments or input streams from I/O devices).
  2. Its evaluation has no side effects (no mutation of local static variables, non-local variables, mutable reference arguments or I/O streams).

Renhet. I imperativa och objektorienterade språk är det vanligt att förändra programmets tillstånd med att modifiera någon variabel som befinner sig utanför funktionen som körs. I funktionella programmeringsspråk är det vanligare att funktioner inte får innehålla så kallade sidoeffekter, detta betyder att funktionen inte kan förändra programmets tillstånd med att förändra någon variabel som befinner sig
utanförfunktionen. Sådana funktioner kallas vanligtvis rena (”pure” på engelska) funktioner [9]. En ren funktion är liknande till funktioner från matematik där returvärdet inte är beroende på programtillstånd och kommer alltid att returnera samma resultat med lika parameter. Rena funktioner har alltså två egenskaper. Lika input producerar alltid lika output och de har inga sidoeffekter.

38
Q

Vad är överskuggning/Method overriding?

A

Method overriding, in object-oriented programming, is a language feature that allows a subclass or child class to provide a specific implementation of a method that is already provided by one of its superclasses or parent classes. The implementation in the subclass overrides (replaces) the implementation in the superclass by providing a method that has same name, same parameters or signature, and same return type as the method in the parent class. The version of a method that is executed will be determined by the object that is used to invoke it. If an object of a parent class is used to invoke the method, then the version in the parent class will be executed, but if an object of the subclass is used to invoke the method, then the version in the child class will be executed.

39
Q

Vad är ett programmeringsparadigm?

A
  1. En eller flera egenskaper (features) som ett programmeringsspråk har.
  2. En eller flera egenskaper (features igen) som ett språk inte har.
  3. De bakomliggande antagandena bakom språkets modell.

Det finns inte en one-to-one-mappning mellan paradigmer och språk. Många av de vanligaste programmeringsspråken stödjer flera paradigm (och då släpper man på krav på vad språket inte får ha). Vissa språk stödjer svagt eller delvis ett paradigm.

40
Q

Högnivåspråk och lågnivåspråk.

A

Program som ligger nära hårdvaran kallas lågnivåspråk. Ett exempel är assembler.

Språk som försöker abstrahera bort delar av hårdvaran kallas högnivåspråk. Ex. Java, C#

Vad som räknas som högnivåspråk förändras från år till år. Assembler har alltid varit ett lågnivåspråk, men på sistone har C börjat räknas dit.

41
Q

Flödeskontroll i imperativprogrammering.

A

I koden finns labels (etiketter). För att förflytta sig till en label i assembler så används en branch (hopp).

Dessa har namn som branch if equal (beq), branch if not equal (bne), branch if less than (blt), eller liknande. Dessa kollar statusflaggor på CPU:n som sätts i samband med jämförelser.

I C och BASIC heter motsvarande instruktion goto.

42
Q

Strukturerad programmering.

A

Påminner om imperativ programmering, men…

  1. Vi introducerar for- och while-satser/loopar.
  2. Vi förbjuder goto…

Dijkstra, Edsger; “Goto statement considered harmful.”; Communications of the Association for Computing Machinery (CACM 1968)

…Men Donald Knuth protesterar (1974) Structured programming with goto…

  1. Strukturerad programmering försöker förbjuda flera retursatser från samma funktion, men många protesterar mot det också.
43
Q

Procedurell programmering

A

En procedur är det vi kallar funktion, procedur, metod eller subrutin i programmeringsspråk.
Procedurell programmering bygger vidare på strukturerad programmering men lägger till konceptet räckvidd (scoping) för variabler. Detta innebär att programmet glömmer bort namn när vi lämnat funktionen.

Språk som stödjer denna sorts procedurer: Fortran, Algol, COBOL, Basic

44
Q

Objektorienterad programmering

A

Objektorienterade språk har:

  • Inkapsling
  • Arv
  • Dynamisk bindning av metodanrop
45
Q

Subrutiner, procedurer, funktioner och metoder.

A

Paradigm | parametrar | lokala variabler | returvärden
————————-|—————–|————————|—————–
imperativ, | globala | globala | globala
strukturerad| |
———————————————————————————
procedurell, | by value, | lokala (scoping) | lokala
objektorienterat | by reference | |
———————————————————————————-
deklarativt, | Immutable | Immutable | Immutable
funktionellt, | | |
logiskt | | |

46
Q

Vad är coroutines?

A

Coroutines are a general control structure whereby flow control is cooperatively passed between two different routines without returning.

47
Q

Briefly describe the main differences between weakly typed and strongly typed languages.

A

Weakly typed languages allows a type to be interpreted as another.

Strongly typed languages, also called type safe, means that applying the wrong operation to typed data will result in error.

48
Q

Briefly describe the main differences between static typing and dynamic typing. What are the relative advantages and disadvantages?

A

Static typing means that types and their constraints are checked before executing the program.
• pro: less error-prone
• con: sometimes too restrictive

Dynamic typing mean that type checking is done during program execution.
• pro: more flexible
• con: harder to debug

49
Q

Discuss how the following object-oriented concepts help a programmer design and implement an application. Illustrate your answer with appropriate examples:

  1. encapsulation
  2. inheritance
  3. polymorphism
A

Encapsulation the ability to provide users with a well-defined interface to a set of functions in a way which hides their internal workings. In object-oriented programming, the technique of keeping together data structures and the methods which act on them.

Inheritance the ability to derive new classes from existing classes. A derived class (“subclass”) inherits the instance variables and methods of the base class (“su- perclass”), and may add new instance variables and methods. New methods may be defined with the same names as those in the base class, in which case they override the original one.

Polymorphism in object-oriented programming, the term is used to describe variables which may refer at run-time to objects of different classes.

Pros:

  • implementation reuse
  • inheritance for interface extension and reuse
  • encapsulation for robustness and reliability
50
Q

Distinguish between lazy and eager evaluation in the implementation of applicative (functional) programming languages, illustrating your answer with suitable examples.

A

Lazy evaluation, or call-by-need is an evaluation strategy which delays the evaluation of an expression until its value is needed (non-strict evaluation) and which also avoids repeated evaluations (eval is remembered).

51
Q

Define the functional paradigm and its pros & cons?

A

Functional programming treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data.

Functional programming makes concurrency easier, because:

  • functions are side-effect free and stateless
  • nothing to synchronize, so no locks, semaphores, mutexes
  • Functional paradigm encourages immutable data, which is good for concurrency

Pros:

  • functional languages behave very similar to mathematical functions it’s easy to translate those into functional languages
  • No side effects

Cons:

  • steep learning curve
  • potential lack of IO capabilities.

Languages: Haskell, Racket, Scheme, Closure

52
Q

Define the imperative paradigm and its pros & cons?

A

Imperative programming (procedural) is based on the von Neumann architecture where incremental change of the program state is changed over time though commands governed by control structures.

The natural abstraction is a procedure which abstracts one or more statements as a single command, hence procedural programming.

Pros:

  • good for general purpose programming
  • many resources available - no need to reinvent the wheel

Cons:

  • difficult to maintain the larger the code gets
  • portions of the code are so interdependent that the code in one application will not be useable in another, unlike in OOP

Languages: Fotran, Pascal, C

53
Q

Define the logical paradigm and its pros & cons?

A

Logical programming is based on formal logic and is written as a set sentences in logical form expressing facts and rules about a problem domain where answers are systematically searched for by inferencing from rules and facts.

Pros:

  • Good for AI, and niche applications
  • Well suited to express complex ideas, allowing the dev to focus on what letting the program figure out how.

Cons:

  • Steep learning curve a
  • Inefficient and doesn’t scale well with large knowledge bases.

Languages: Prolog, Datalog

54
Q

Define the object oriented paradigm and its pros & cons?

A

OO programming is based on the concept of objects which model the real world problem domain. Data and operations are encapsulated into objects and objects interact by means of passing messages.

Pros:

  • Encapsulation -
  • Inheritance -
  • Reusability and extensible -

Cons:
- Side effects

Languages: Java, Ruby

55
Q

Define the concurrent paradigm and its pros & cons?

A

Concurrent programming has multiple threads of control allowing it to perform multiple computations in parallel and control external activities to happen at the same time.

Note that parallelism != concurrency. Parallelism is about speed and concurrency is distribution, redundancy, etc.

Pros:

  • allows a process to overlap IO and computation
  • can make a program more responsive (e.g., a GUI thread can respond to button clicks while another thread performs some task in the background). ?
  • can speedup performance.

Cons:
- Considered to be very hard!

Langages: Erlang, Scala

56
Q

What is lambda abstraction?

A

A way of building functions with the lambda notation.
Ex: 1. λx.x+1 or 2. λx. λy. x+y:
1. takes an input x and outputs x+1
2. takes inputs x and y and outputs x+y

Lambda abstraction refers to something we do all of the time. Let’s say I have some code:

(+ 1 2)

I’m adding the number 2 to a number, in this case, 1. I could abstract that into a lambda:

(defn add2 [x] (+ x 2))

Abstraction in the context of lambda calculus means turning some part of a term into a variable. Let’s do an example. Consider the following terms (which use a notation richer than pure lambda calculus):

  • 1+2
  • sin^2(φ)+cos^2(φ)
  • (1/n+1)*t^(n+1)+C
57
Q

What is an lambda application?

A

When you give an lambda function an input.
For example: (λx.x+1) 5 , here x will be subsituted by 5 and this will then be 5+1 = 6. You substitutet the body of the lambda function. It is a way of applaying functions.
————————————————————————————–
An application ts represents the application of a function t to an input s, that is, it represents the act of calling function t on input s to produce t(s).

58
Q

What’s the point with the lambda calculus?

A
  1. It can encode any computation.
  2. Can be regarded as the basis of the functional programming language.
  3. Lambda calculus is presented in most major programming languages (ex. Java, C#).
59
Q

Vad är partiell applikation/partial application?

A

Som det nämnts innan så använder man sig av funktions applikation när man kallar på en funktion med två eller fler parametrar och därmed använder mellan rum mellan de olika inputs.
Ex: max 4 5.

Typen till t.ex. max är:

max :: (Ord a) => a -> (a -> a), som kan läsas som att max tar ett input och returnerar en funktion som tar in a som input och returnerar a.

  • Så att om man kallar på en funktion med för få parametrar så får vi tillbaka en partiell applikation funktion ( partially applied function). D.v.s. en funktion som tar lika många parametrar som vi uteslöt. Partiell applikation är ett sätt att skapa funktioner som vi kan skicka till andra funktioner eller ge de någon slags data.

Ex:
multThree :: (Num a) => a -> (a ->(a -> a))
multThree x y z = x * y * z

och en “partiell applikation” kan vara:
ghci> let multTwoWithNine = multThree 9
ghci> multTwoWithNine 2 3
54

eller:

“By calling functions with too few parameters, so to speak, we’re creating new functions on the fly. What if we wanted to create a function that takes a number and compares it to 100? We could do something like this:

compareWithHundred :: (Num a, Ord a) => a -> Ordering  
compareWithHundred x = compare 100 x  " ------------------------------------------------------------------------------------------ In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity. Given a function f : ( X × Y × Z ) → N, we might fix (or 'bind') the first argument, producing a function of type partial ( f ) : ( Y × Z ) → N  Evaluation of this function might be represented as f partial ( 2 , 3 ). Note that the result of partial function application in this case is a function that takes two arguments. Partial application is sometimes incorrectly called currying, which is a related, but distinct concept.  ------------------------------------------------------------------------- Partial application in Haskell involves passing less than the full number of arguments to a function that takes multiple arguments. 

For example:

add :: Int -> Int -> Int
add x y = x + y

addOne = add 1

In this example, addOne is the result of partially applying add. It is a new function that takes an integer, adds 1 to it and returns that as the result.

60
Q

Difference between currying and partial application?

A

Currying is about turning/representing a function which takes n inputs into n functions that each take 1 input. Partial application is about fixing some of the inputs to a function.