Haskell og eksterne filer

Haskell og eksterne filer

Thu 31 December 2009

For denne artikkelen går vi ut ifra at du har installert en fungerende Haskell implementasjon med interaktiv sessions. Hvordan du gjør dette kan du lese om

Opprett og last inn kildekodefil i Haskell (WinHugs)

1: Opprett ny fil med notepad eller tilsvarende. I vårt eksempel Load.hs

2: I filen skriver vi

module Load
where
x = 1
y = 2
z = 3

Det som er verdt å merke seg her er at navnet på modulen tilsvarer filnavnet "Load" og "Load.hs"

3: Lagre filen.

4: I WinHugs "File" -> "Open", og velg den filen du nettopp opprettet.

Hugs> :load "D:\\Haskell\\Load.hs"

Hugs session for:
file:{Hugs}\packages\hugsbase\Hugs\Prelude.hs
file:{Hugs}\packages\base\Prelude.hs
file:{Hugs}\packages\hugsbase\Hugs.hs
file:.\Load.hs
Load>

5: Vi kan nå teste programmet vårt.

Load> x
1 :: Integer
Load> x + y + z
6 :: Integer
Load> x * y + z
5 :: Integer

6: Vi har nå laget en ny module "Load", og lastet denne i Interpreteren vår. Den har da automatisk blitt satt til aktiv modul. Der vi tidligere har hatt "Prelude>" som promt har vi nå fått "Load>".

Dette impliserer at også "Prelude" er en module, noe som stemmer. "Prelude" er standardmodulen som inneholder de grunnleggende definisjonene som : + * fst snd og så videre.

PS! Om du planlegger å kompilere modulen til et kjørbart program må den here Main, samt inneholde en main metode.

module Main
where

main = putStrLn "Hei verden"

Husk også at Hugs ikke er en kompilator, kun en Interpreter. Men om du har lagt inn ghc kan du kompilere v.h.a denne kommandoen:

ghc --make Main.hs -o main.exe

Du får nå en kjørbar fil som du kan starte ved å skrive:

main.exe

Eventuellt vil Eclipse Haskell pluginen generere .exe filer for deg dersom du bruker denne.

Fibonacci

For de som er ukjent med Fibonacci tallrekken så anbefaler vi å ta en rask kikk her.

Fibonacci rekken er definert på følgende måte:

fib 0 = 1
fib 1 = 1
fib n = fib (n−1) + fib (n−2), for n > 1

Vi er optimistiske og klipper / limer dette rett inn i Load.hs og laster modulen inn på ny.

module Load
where

fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
public class Fibonacci {
public static long fib(int n) {
if (n <= 1) return n;
else return fib(n-1) + fib(n-2);
}

public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
for (int i = 1; i <= N; i++)
System.out.println(i + ": " + fib(i));
}

}

For morro skyld tar vi og med en tilfedig Java implementasjon. Du kan jo selv bestemme hvilken du likte best, spesielt m.t.p definisjonen av Fibonacci rekken.

Og om du var i tvil, Haskell implementasjonen fungerer som den skal, og er et godt eksempel på enkelheten og oversiktligheten til språket.

Load> fib 0
1 :: Integer
Load> fib 1
1 :: Integer
Load> fib 10
89 :: Integer
Load> fib 100
354224848179261915075 :: Integer

NB! I siste eksempelet "fib 100" har jeg jukset. Denne tar så lang tid å evaluere rekursivt at jeg måtte slå opp resultatet istedetfor. Men poenget her var å vise at vi ved kun å bruke definisjonen på fibonacci rekken har laget et program som beregner et vilkårlig tall i rekken.

Oppgave: Finn en "feil" i fibonacci programmet definert over. Kan du lage et mer effektivt program for å beregne fibonacci rekken?

Tagged as : haskell