Permalänk
Medlem

Vilket funktionellt språk?

Blev lite sugen på att lära mig ett funktionellt språk, dock har jag ingen anning om vilket... Något tips?

Permalänk
Hedersmedlem

Själv dyrkar jag O'Caml (Objective Caml). Syntaxen är ren (när man vänjer sig) och språket är kraftfullt. Dessutom är det mysigt att kunna blanda tre paradigmer (funktionellt, imperativt och objektorienterat) samt kunna köra det interprenterat, bytecode-kompilerat eller binärkompilerat.
Att det sedan kommer i närheten av C i hastighet när det gäller vissa saker gör ju inte saken sämre.

Visst, det är inget renrasigt funktionellt språk, men det är förbannat trevligt att arbeta med. Mitt favorit-"generic-språk".

Har inte kodat några andra funktionella språk (med undantag för ytterst lite Lisp och Scheme) så jag kan inte uttrycka mig så mycket om andra, tyvärr.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Haskell Eftersom det är det enda funktionella språket jag kodat i så kan jag inte påstå att jag vet om det är det mest lämpliga för att lära sig, men det är iaf en upplevelse, som gav mig en inte alltför vanlig känsla av ångestglädje-intresse
Kommer prova på Ericsson Erlang inom några veckor och det ska bli mycket intressant.

Permalänk
Glömsk

Finns många fina funktionella språk. Jag kommer dock rekommendera Scheme för då får du en ursäkt att läsa den bästa datavetenskapliga boken som någonsin skrivits: Structure and Interpretation of Computer Programs

Boken finns även online (fast är annars inte så dyr): http://mitpress.mit.edu/sicp/full-text/book/book.html

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Tack för tipsen! Tar gärna emot fler

LISP är det väl många högskolor som lär ut, är det något att ha?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av savje
LISP är det väl många högskolor som lär ut, är det något att ha?

Det är helt klart inte fel att lära sig, i alla fall.

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kode
Det är helt klart inte fel att lära sig, i alla fall.

Men jämfört med andra funktionella språk? Jag är intresserad av att lära mig AI lite mer, och fått uppfattningen att funktionellt är vägen man ska gå då... Något av språken som är bättre eller inriktat mot det?

Edit: Kan ju tillägga att jag inte direkt älskar den typen av syntax som BASIC eller python har, utan skulle föredra ett språk vars syntax liknar C/Java osv. Vet inte om man kodar på så olika sätt att syntaxerna blir ojämförbara...

Permalänk
Medlem

Prolog kan vara värt att ta en titt på om man vill programmera AI.

http://en.wikipedia.org/wiki/Prolog#Programming_in_Prolog

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av savje
Tack för tipsen! Tar gärna emot fler

LISP är det väl många högskolor som lär ut, är det något att ha?

Scheme är en Lisp.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Ruby är en acceptabel Lisp.

Permalänk
Medlem

Lisp är nog inte så dumt, men man kanske blir lite besvärad av alla () i början innan man har vant sig, då föredrar jag helt klart Haskells lösning på det istället med betydelsefulla whitespace. Så mitt förslag är Haskell (som används som intro till funktionell programmering på iaf Chalmers om du tyckte högskolespråk var intressantast). Sen är Scheme tänkt att vara väldigt "enkelt", har ju tagits upp här på swec några gånger hur liten hela specefikationen på språket är.

Men båda är iaf rena, till skillnad mot OCaml, och det kanske är en fördel i början så du blir tvingad in i det funktionella tänket. Eller så är det en nackdel om du vill mjukstarta..

(Om du funderar på pokerAI-tävligen så är Haskell en fördel då iaf 2 (en är jag) sagt att dom tänkt skriva i Haskell, så det kan ju vara fördel även om det säkert inte blir någon tok-djup AI).

Permalänk
Avstängd

Jag tycker Scheme - för det är så litet och enkelt. Man lär sig det på några timmar, typ. Inte riktigt, men nästan. Så kan man lägga all tid på att programmera istället för att slå upp syntaxen.

Annars Haskell, men det är mera att lära sig. Men det är väldigt snyggt och elegant. På Chalmers är Haskell mycket använt, tror jag.

Men funktionella språk är bra att ha tittat på.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av vb
Men båda är iaf rena, till skillnad mot OCaml, och det kanske är en fördel i början så du blir tvingad in i det funktionella tänket. Eller så är det en nackdel om du vill mjukstarta..

Tja, även om O'Caml kan kodas imperativt och OO så måste man det inte.
Jag undviker den imperativa funktialiteten för det mesta (gäller dock att koll på vad som är imperativt i språket för det). Ibland är det dock bekvämt.

Men visst, vill man vara säker på att lära sig riktig funktionell programmering så underlättar det ju med ett språk som inte har något sådant.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Personligen tycker jag sml är väldigt mysigt. Funktionella språk var väldigt läskigt för mig i början, men när man började förstå hur kraftfullt rekursion och liknande är kan man inte sluta älska det.

Jag hade för mig att logikprogrammering ska vara bra för AI, men om man inte ska göra så otroligt avancerad AI går nog de flesta språken bra.

Visa signatur

http://www.dvp.nu
#dvp @ quakenet.org

Permalänk
Citat:

Ursprungligen inskrivet av skj123
Prolog kan vara värt att ta en titt på om man vill programmera AI.

http://en.wikipedia.org/wiki/Prolog#Programming_in_Prolog

Prolog är dock ett logiskt språk, inte ett funktionellt.

Permalänk
Medlem

Tack för alla tipsen

vb: betydelsefulla whitespace är nog itne riktigt min visa, åandrasidan verka "lazy evaluation" riktigt häftigt... Sen faller nog OCaml bort för jag tror inte jag har tillräcklig disciplin för att inte fall in i 'vanlig' programmering. Men blir nog Scheme eller Common Lisp.

Tänkte nog inte köra poker-AIn i funktionell, i alla fall inte den jag tänkte ställa upp med...

emilsson: Läser inget programmeringsinriktad utbildning (maler på med filosofi ) så programmeringen är bara ett intresse för mig så att jag ska ha användning av Haskell vid utbildning är inget som riktigt biter på mig... iofs är det kanske en indikation på att det är ett bra ingångsspråk (kasnke var det du menade)...

"Logik-språk" som Prolog, hur pass svårt är det att sätta sig in i dom, kanske är en bra idé att ta vägen genom funktionella? Annars tror jag att det skulle tilltala mig, då jag har en ohälsosam fetish för logik o formella system...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av savje
"Logik-språk" som Prolog, hur pass svårt är det att sätta sig in i dom, kanske är en bra idé att ta vägen genom funktionella? Annars tror jag att det skulle tilltala mig, då jag har en ohälsosam fetish för logik o formella system...

tycker du om diskret matematik och den delen av logiken kommer du gilla prolog också. ^^

jag har själv tänkt ta tag i prolog igen (gjorde ett par labbar i det för några år sedan, så jag tänkte se om jag inte kan göra något användbart i det), har hört att denna tutorial ska vara rätt bra.

erlang kan ju också vara intressant. det tycker iaf jag ^^

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av TheGoodOne
Prolog är dock ett logiskt språk, inte ett funktionellt.

Tur att nån är vaken...

Lite introföreläsningar som både tar upp funktionell och logisk programmering(real player):

http://webcast.berkeley.edu/course_details.php?seriesid=19069...

Permalänk
Medlem

Ett coolt språk som inte har nämts är Clean:
http://clean.cs.ru.nl/About_Clean/about_clean.html

Det som är coolt med Clean (jag har tyvärr inte provat det själv ännu) är att det har lat evaluering men lyckas gömma latheten på något vis så att man kan uttrycka sig i det på vanligt sätt med tilldelningar och andra destruktiva operatorer. Det är vad de påstår iaf. I andra lata språk som t.ex. Haskell blir I/O och liknande i grunden imperativa uppgifter väldigt knöliga.

Jag skulle hur som helst helt klart rekommendera dig ett språk med lat evaluering. Detta eftersom du i andra funktionella språk visserligen kan uttrycka dig på ett rent och tydligt vis (funktionellt, dvs utan sidoeffekter), men där drabbas av negativa effekter på prestanda om du använder dig av denna programmeringstil. Om du t.ex. vill utföra två väsensskilda beräkningar på en datastruktur så vill du antagligen lägga dessa beräkningar i olika funktioner. Om du applicerar dem i tur och ordning på datastrukturen i ett språk utan lat evaluering så kommer datastrukturen att gås igenom två ggr, men med lat evaluering kommer kompilatorn förhoppningsvis att kunna väva ihop bägge operatiorna och nöja sig med att traversera strukturen en gång. Du kan alltså separera delar som ska vara separerade, medans du i språk som Scheme eller Java hade varit tvungen att slå ihop bägge funktionerna Foo och Bar till en funktion DoFooAndBar() för att undvika att behöva gå igenom datastrukturen två gånger.

Jag hade nog valt Haskell, Clean eller Scheme (om jag inte redan kunde Scheme). Scheme är ganska coolt eftersom det är så lätt att experimentera och bygga egna språkkonstruktioner i. Schemes regelbundna syntax (eller brist på syntax över huvud taget) gör det lättare att skriva kraftfulla macron som skriver om kodsnuttar till andra kodsnuttar. Där har Scheme ett övertag mot andra funktionella språk.

En annan cool grej med Haskell är pattern matching. Det kan du iofs få i andra funktionella språk också (i många scheme'ar och i OCaml iaf), men jag har fått för mig att det funkar som bäst i Haskell. Kanske funkar lika bra i OCaml dock, jag vet inte säkert.

Visa signatur

Alla män är dödliga. Sokrates var dödlig. Alltså är alla män Sokrates.

Permalänk
Hedersmedlem

Något jag missade förut med O'Caml som (jag tycker) är coolt är att det är starkt typat. Man kan inte blanda datatyperna, eller casta dem.

Betrakta detta:

# 1 = 1.0;;

i andra språk hade detta returnerat true, eftersom att 1 är detsamma som 1.0. Men inte i O'Caml:

# 1 = 1.0;; This expression has type float but is here used with type int

Självklart gäller detsamma vid andra operationer, som addition, subtraktion, multiplikation, division, osv.

Finns dock lite smågenvägar, som funktionen (detta är något annat jag gillar med O'Caml, dess sätt att beskriva funktioner)

val int_of_float -> float -> int

Så visst, med lite vilja går det att "blanda", men det går inte utan att omvandla värden först.

Jag själv älskar detta, ger en mer robust känsla på något vis.
Självklart är inte det här något nytt koncept, men det är ändå trevligt, och i kombination med O'Caml så blir det ännu trevligare.

EDIT: Hmm, kom just på att Haskell också är starkt typat, om jag inte minns fel?

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Tack för all hjälp åter igen

Det blev scheme... har börjat lite smått och gillar det hittentills men undrar en grej... Kan man overloada funktioner på något sätt?
Ett exempel, en liten kod som avgör om ett visst tal är en kub (alltså om det för y finns något positivt heltal x där x^3=y gäller):

(define (cube x) (* x (* x x))) (define (isCubeMod tal ref inc) (cond ((= inc 0) (isCubeMod tal ref 1)) ((= inc 1) (cond ((< (cube ref) tal) (isCubeMod tal (+ ref inc) inc)) ((= (cube ref) tal) #T) ((> (cube ref) tal) #F))) ((< (cube ref) tal) (isCubeMod tal (+ ref inc) inc)) ((> (cube ref) tal) (isCubeMod tal (- ref inc) (floor (/ inc 3)))) ((= (cube ref) tal) #T))) (define (isCube tal) (isCubeMod tal 0 tal))

Här skulle jag vilja overloada "isCube"...

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av SPENEN
Personligen tycker jag sml är väldigt mysigt. Funktionella språk var väldigt läskigt för mig i början, men när man började förstå hur kraftfullt rekursion och liknande är kan man inte sluta älska det.

Jag hade för mig att logikprogrammering ska vara bra för AI, men om man inte ska göra så otroligt avancerad AI går nog de flesta språken bra.

sml är mysigt, precis som OCaml.
Båda är ju ML-varianter så det känns rätt lika, fast OCaml är lite bättre (som sagt prestanda). Utna någon riktig pluggande (bara lite uppslag av syntax) lyckades jag snabbt få ihop ett OCaml-program för att lösa lite problem på mathchallenge, bara genom att kunna SML.

AI finns det ju många olika saker som behövs olika saker för. För att bevisa logiska satser osv kan jag tänka mig logikspråk är utmärkt till, för andra uppgifter kan man ju ha expert system (som en miljö) att arbeta i.

På det hela så är det så jäkla intresseant med andra paradigmer och andra sätt att lösa problemen. Man inser att procedurprogrammering som C är "skitigt".

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk

Lisp är ju parantesernas språk, jäkligt kraftfullt vad det gäller listor.

Prolog är oerhört trevligt och har fina möjligheter för att parsa naturliga språk (den typen som människor använder för kommunikation alltså), använde det när jag läste en kurs i språkbehandling och datalingvistik.

Det första funktionella språket som jag lärde mig var SML (Standard ML, googla), enkelt och trevligt.

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av savje
Tack för all hjälp åter igen

Det blev scheme... har börjat lite smått och gillar det hittentills men undrar en grej... Kan man overloada funktioner på något sätt?
Ett exempel, en liten kod som avgör om ett visst tal är en kub (alltså om det för y finns något positivt heltal x där x^3=y gäller):

(define (cube x) (* x (* x x))) (define (isCubeMod tal ref inc) (cond ((= inc 0) (isCubeMod tal ref 1)) ((= inc 1) (cond ((< (cube ref) tal) (isCubeMod tal (+ ref inc) inc)) ((= (cube ref) tal) #T) ((> (cube ref) tal) #F))) ((< (cube ref) tal) (isCubeMod tal (+ ref inc) inc)) ((> (cube ref) tal) (isCubeMod tal (- ref inc) (floor (/ inc 3)))) ((= (cube ref) tal) #T))) (define (isCube tal) (isCubeMod tal 0 tal))

Här skulle jag vilja overloada "isCube"...

Hmm, var det inte då man skrev Lambda eller nåt?
Kolla boken Psionicist länkade till.

Permalänk
Avstängd

Den boken är jävligt bra. Då menar jag jävligt bra. Den ska läsas.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Aqualize
sml är mysigt, precis som OCaml.
Båda är ju ML-varianter så det känns rätt lika, fast OCaml är lite bättre (som sagt prestanda). Utna någon riktig pluggande (bara lite uppslag av syntax) lyckades jag snabbt få ihop ett OCaml-program för att lösa lite problem på mathchallenge, bara genom att kunna SML.

Jo precis, anledningen till att jag syslat med sml (eller moscow sml) är att det lärs ut på den utbildningen jag går, men OCaml verkar ju användas mer i "verkligheten" så att säga =).

Visa signatur

http://www.dvp.nu
#dvp @ quakenet.org

Permalänk
Medlem

Jag läste Haskell (LTU) och tyckte det var lärorikt, fast det är väl inget jag skulle vilja koda något stort i direkt
Mycket bra grejer som list comprehension, map och whatnot finns ju med i python också dock så det följer ju med den vägen