Permalänk
Medlem

IO vs. Funktioner i Haskell

Jag har håller på och pluggar till en tenta och har glömt bort detta. Och jag hittar inget på nätet, så..

1) Vad är det för skillnad på A -> B och A -> IO B ?
2) Vad är det som man kan göra med den ena men inte med den andra?
3) Vad är det för mening att dela upp dessa funktioner?
o.s.v

Detta är inte läxa/uppgift eller något annat, så jag försöker inte fuska eller nått. Vill bara har lite hjälp med inlärningen

Visa signatur

"Maybe one day you will learn that your way, is not the only way"

Permalänk
Medlem
Permalänk
Medlem

Så "A -> B" kan ha vanliga funktioner medans "A -> IO B" måste ha actions ?

Visa signatur

"Maybe one day you will learn that your way, is not the only way"

Permalänk
Medlem

Ja, men A -> IO B måste också ha ett return-statement. Det var så länge sedan jag höll på med Haskell att jag tyvärr inte kommer ihåg så mycket...

Permalänk
Medlem

1. A -> B betyder en funktion som tar in ett argument av typen A, och returnerar ett svar av typ B. A -> IO B samma sak, förutom att svaret är av typen IO B istället för B Dvs A -> IO B returnerar någonting av typen B wrappat i ett IO. Och det finns inget (vettigt) sätt för dig att hämta ut Bet annat än att köra hela programmet.

2. I funktionen som returnerar IO B kan du göra IO, tex läsa/skriva till filer, hämta input från användaren mm. Men som straff så kommer din funktion så fort du vill göra någon IO att fastna i "IO-monaden", dvs alla funktioner som använder den funktionen måste även dom returnerna IO nånting.

3. Det är ett sätt att hålla Haskell rent från sidoeffekter. Om du anropar en funktion som inte slutar med IO så kan du vara säker på att dess resultat alltid kommer vara detsamma för samma input.
Dvs om du i tex Java kodar en funktion som räknar ihop två tal kan du inte se på den utifrån om den alltid kommer ge tillbaka samma tal om du skickar in samma parametrar.
int Sum(int x, int y) {...}
Men om du i Haskell skriver samma funktion
sum :: Int -> Int -> Int
kan du vara säker på att skickar du in 123 och 432 kommer svaret alltid bli exakt samma. Det kan du inte i Java om du inte verkligen tittar på hur sum-funktionen är skriven.

Ett litet tips: "A Gentle Introduction to Haskell" som bjornie länkade till är inte alls speciellt gentle, så om du inte har någon egen bok att titta i kanske du hellre vill läsa tex Real World Haskell (http://book.realworldhaskell.org/read). Det finns en hög med Monad-tutorials på haskell-wikin oxå ifall du tyckte mitt inlägg sa något vettigt och det som fanns i A Gentle.. inte gjorde att du förstog allt (IO är alltså en speciell sorts "Monad"). http://www.haskell.org/haskellwiki/Tutorials#Using_monads

En funktion som är A -> IO B måste ge tillbaka svaret i ett IO. Men du kan injicera ett "vanligt" värde i IO om du vill:

test :: Int -> IO Int test x = return (x+1)

Permalänk
Glömsk

En bra artikel som jag brukar rekommendera när diskussioner om monader dyker upp är http://blog.sigfpe.com/2006/08/you-could-have-invented-monads...

Denna handlar inte specifikt om IO-monaden dock.

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 allihopa

Visa signatur

"Maybe one day you will learn that your way, is not the only way"