Trädvy Permalänk
Medlem
Plats
Origin
Registrerad
Aug 2003

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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007
Trädvy Permalänk
Medlem
Plats
Origin
Registrerad
Aug 2003

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

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2007

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...

Trädvy Permalänk
Medlem
Plats
Sthlm
Registrerad
Okt 2001

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)

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Trädvy Permalänk
Glömsk
Plats
Userland
Registrerad
Jul 2001

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.

...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.

Trädvy Permalänk
Medlem
Plats
Origin
Registrerad
Aug 2003

Tack allihopa

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