Mittwoch, 23. Dezember 2009

Haskell, C and anonymous functions

There have been some remarkable updates and changes to this post. You might want to skip some parts and look right at the bottom of this entry.

Recently a friend of my asked in how he would benefit from using Haskell. At first I was not able to give him a satisfying answer. But heading on and crawling deeper in the mindset of functional programming and Haskell I came across anonymous functions.
This isn't something specific to functional programming but a rather common concept which simply spoken allows one to pass a function as an argument to another function. There's much more behind it but for me it works to think like that about it.
After reading that this is similar to function pointers in C I hacked together a small example on how to use function pointers in C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct mathfunc {
int (*func)(int *a, int *b);
} mathf;

void loop(int *a, int *b, mathf *mf) {
if (mf == NULL || a == NULL || b == NULL) return;
if (mf->func == NULL) return;
else {
fprintf(stdout, "%i\n", mf->func(a, b));
loop(a, b, ++mf);
}
}

int iadd(int *a, int *b) {
return (*a) + (*b);
}

int imult(int *a, int *b) {
return (*a) * (*b);
}

int isub(int *a, int *b) {
return (*a) - (*b);
}

int idiv(int *a, int *b) {
return (*a) / (*b);
}

int main(int argc, char **argv) {
int a = 12, b = 3;
int *c = &a, *d = &b;

mathf mf[] = {{iadd}, {imult}, {isub}, {idiv}, {NULL}};

loop(c, d, mf);

return 0;
}

Following this I wrote an example in Haskell.
calc :: [a -> a -> a] -> [a] -> [a]
calc (m:ms) (x:y:xs) = (m x y):(calc ms (x:y:xs))
calc _ _ = []

iadd :: (Integral a) => a -> a -> a
iadd x y = x + y

imult :: (Integral a) => a -> a -> a
imult x y = x * y

isub :: (Integral a) => a -> a -> a
isub x y = x - y

idiv :: (Integral a) => a -> a -> a
idiv x y = x `div` y

is = [12,3]
fs = [iadd, imult, isub, idiv]

main = do putStrLn (show (calc fs is))

These two code snippets do exactly (well almost..) the same. Judge yourself which one looks nicer and which you think is more intuitive to read.
After all it's just syntactic sugar..

[Update]
liamoc wrote that I'm not really talking about anonymous functions here but about first class functions. So I read up a bit and now I can contribute this:

Anonymous functions are functions which have no name, they are created on the fly. This can be done in Haskell (and other languages) with the lambda operator: \. The backslash is symbolic for the backslash in the greek lambda letter: λ (see? see? :) )
Personnaly I can't think of a way on how to resemble this in C but maybe some C guru might come up with some tricks.

Furthermore "first class functions" are functions which can be handled like objects. This means that it's possible to instantiate a function on runtime, pass these functions as arguments to other functions (which are then called "higher-order functions") and return functions from functions. For a functional programming language this is something crucial.
This reminds me strong of functors in C++ and I think I'm not to far off with this comparison.

liamoc gave also a nice example of how one could solve the task in a really tight Haskell manner so I also tried to find a smarter solution. This is what I came up with:

calc (f:fs) (x, y) = (f x y):(calc fs (x, y))
calc _ _ = []

functions = [(+),(-),(*),(/)]
xs = (12, 3)

main = do putStrLn (show (calc functions xs))

If you like the idea of anonymous functions try this:

functions = [
\a -> \b -> a * b,
\a -> \b -> a + b,
\a -> \b -> a - b,
\a -> \b -> a `div` b
]

Finally i hope that i got everything right this time. Feel free to correct me. :)
[/Update]

(Real World) Haskell

Thanks to Xmonad I got interested in Haskell recently. So after a few disappointing attempts to learn it from online tutorials like this one or that one I decided to grab Real World Haskell.
Don't get me wrong, the tutorials mentioned above are great and I still return now and then to look up various things. But obviously I am that kind of guy who needs some paper at hand and read it in an calm hour.
I've made some pretty good advancement with this book now and I can only recommend it to everybody interested in functional programming and/or Haskell.

Samstag, 7. November 2009

Mozilla Weave

The last firefox update reminded me to write about a plugin which adds a feature which i missed for a long time. Weave gives you the possibility to sync your bookmarks, tabs, history, form data and passwords between all of your computers. That's pretty nice when you look up something on your laptop or at work and later at home you wish to access this information again. Instead of doing the hard google search job again you can now go to history and/or check your browsing data from the other computer.
One problem occured to me though. There's a chance to forget all of your passwords since you don't have to enter your username/password in every forum and community site again. But on the other hand all of your browsers data lies now safely encrypted in the mozilla cloud so you would only need to remember your password there.

There's even support for FreeBSD now.
So go ahead and give it a try!

Donnerstag, 24. September 2009

Karten auf Google maps

Die Routen sind jetzt bei Google maps zu finden, war allerdings teilweise eine ganze schöne Fummelei das hin zu bekommen, zumal Google maps keine Fährverbindungen kennt.
Aber jetzt ist alles an Ort und Stelle und gut ist. Allerdings werde ich nicht die ganzen Bilder mit einfügen, sonst sitze ich noch tagelang da. Die Ortsangaben im Picasa Webalbum müssen reichen.

Die Routen auf dem Northern Island (größere Karte):




Und auf dem Southern Island (größere Karte):


Mittwoch, 23. September 2009

Back again und schon wieder voll im Stress

Hier noch eine kurze Zusammenfassung der letzten Tage.
Gestern Abflug in Christchurch (tolle, achwas, grandiose Lounge von Air NZ), 10 Stunden nach Singapur, 5 Stunden Aufenthalt dort (keine schöne Lounge von Singapore Airlines..). Im Flieger habe ich Phantomschmerz gesehen, ein wirklich guter Film basierend auf dem Leben von Stephan Sumner. Dann 12 Stunden Flug nach Frankfurt. Meine Augen brennen von der Entzündung (Es ist seeeeeeeeeeeeeeehr windig in Neuseeland), meine Nase ist ausgetrocknet, aber ansonsten bin ich wieder glücklich zu Hause. Gesamtreisezeit in etwa 36 Stunden, also schneller als die Anreise. Die letzten neuseeländischen Cookies sind auch schon verputzt (wer hätte das gedacht.. :) und der Stress geht schon wieder los, telefonieren, Post sortieren, Angelegenheiten regeln. Zum Glück gibt es in Frankfurt die sogenannte "Welcome Lounge" der Lufthansa, dort konnte ich mich Duschen.
Trotz Antibiotika und wieder aller Vernunft habe ich dann noch das schöne Wetter gestern genutzt und mich aufs Rennrad gesetzt. Flugstress, Jet-Lag und Infekt haben aber nur ganz locker 45 Minuten zugelassen.
Heute bedingt durch die Krankheit wieder ziemlich kaputt, hoffentlich helfen die anti biotics bald mal was..

Sonntag, 20. September 2009

Halsschmerzen

Krank werden im Urlaub ist doof. Noch unangenehmer ist es wenn man dann auch noch einen Tag flachliegt und z.B. Sightseeing in Christchurch verpasst. Die Aussicht auf 20 Stunden Flug mit Erkältung ist auch nicht gerade erheiternd.
Bei der Fahrt nach Stewart Island habe ich dem Fährpersonal etwas zusätzliche Arbeit bereitet weil mein Frühstück unbedingt etwas von den Wellen in der Foveaux Strait sehen wollte.
Damit waren auch die knapp die 5 Stunden Aufenthalt kein Thema mehr.. erholen von der Überfahrt, (mental) vorbereiten auf die Heimfahrt und ein paar Postkarten verschicken.
Mehr war leider nicht drin, mir ist sogar auf der Busrundfahrt wieder schlecht geworden..
Heute wenigstens noch einen halben Tag Christchurch gucken und dann Koffer packen für morgen früh.

Mittwoch, 16. September 2009

Viel zu schnell vergeht die Zeit..

..während zwischendurch eine ganze Menge passiert. Zum Beispiel Cape Reigna, Coromandel Peninsula, Napier und New Plymouth. Ein Tag Sightseeing in Wellington. Eine Fahrt mit der Fähre von der Nord- auf die Südinsel. Franz Josef und Fox Glacier. Ein Tagesausflug zum Doubtful Sound und das gewaltige Manapouri Wasserkraftwerk. 22km wandern auf dem Keppler Track, für mehr ist leider keine Zeit..
Natürlich habe ich von allem fleissig Bilder gemacht und schon angefangen die Bilder im Picasa Webalbum den zu den passenden Orten hinzuzufügen.
Macht aber mit einer GPRS Verbindung nicht wirklich Spaß, darum wird das wohl erst zu Hause so richtig was. Dort werde ich die Bilder dann auch in einer brauchbaren Auflösung hochladen.
Morgen also Stewart Island.

Donnerstag, 10. September 2009

 
Hier also wie versprochen der Fotobeweis für den Airbus "Nürnberg", der uns vor mittlerweile fast zwei Wochen nach Seoul gebracht hat. Mittlerweile ist viel passiert, die Tage vergehen wie im Flug (..?!) und wir sind bereits auf der Südinsel. Momentan hier: Greymouth Seaside Top Ten Holiday Park
Posted by Picasa

Donnerstag, 3. September 2009

Internet!

Inmitten der neuseeländischen Pampa gibt es Internet.. wenn das Handy Empfang hat, und das ist zumindest hier der Fall. Da wird man also auf dem Beifahrersitz durch Serpentinen kutschiert und kann dank Vodafone einen Blogeintrag nicht nur tippen sondern auch noch absenden.
Nebenbei dann noch bei google maps die Strecke überprüfen und gucken wieviel Kilometer es wohl noch sind.
Wenn auch nicht wirklich schnell. Gefühlte ISDN Geschwindigkeit lässt Nostalgiegefühle aufkommen.
Zwischendurch kann man dann sogar noch schnell die Ausweichroute für einen falschen Abzweig in einem kleinen Kaff nachsehen. Dynamische Routeplannung fast wie mit einem Navi.
Ich bin begeistert und schmecke die Zukunft.
Die heutige Strecke bei google maps:

Größere Kartenansicht
Bilder gibts mit street view.. allerdings ist die Realität um Welten besser.
Eigene Fotos liefere ich demnächst mal nach, das Kabel für die Kamera liegt immernoch im Koffer.

Jetzt muss ich aber abschalten, bevor ich meinen Mageninhalt auf die Tastatur ausleere..

Sonntag, 30. August 2009

Firefox, Vimperator, readitlater

Firefox ist spitze, das ist klar, besser wirds mit Vimperator (für all diejenigen die den VIM lieben :) ) und richtig toll wird die Sache zumindest am Laptop mit dem readitlater Plugin.

Tipp hierzu: set (no)online

Air New Zealand Lounge, Sydney

Der nächste Lounge Aufenthalt steht an. Diesmal in Australien und zum Glück "nur" ca. 6 Stunden. Immerhin gibt es hier Müsli. WLAN geht unter Leetnux auch, mag der Pinguin keine koreanischen Access Points? Vermutlich lag es am dhcpcd, mangels Zeit und Lust werde ich das aber wohl nie erfahren.
Duschen kann man sich auch hier wieder, das ist wirklich eine angenehme Erfrischung und macht die lange Reisezeit erträglich. Dennoch bin ich froh, wenn wir heute abend um 19.15 lokaler Zeit NZ endlich angekommen sind.
Beim Anflug konnte man einen atemberaubenden roten Sonnenaufgang über Australien beobachten. Die Glut-/Rubin-/Blutrote kommt vermutlich aufgrund der (roten) Staubpartikel aus dem Outback in der Luft zu Stande. Außerdem war bei der Landung sehr schön die Harbour Bridge und die Oper zu sehen.
Was ich im letzten Post vergessen habe: Von Frankfurt nach Seoul sind wir mit dem Airbus "Nürnberg" der Lufthansa geflogen, da kommt natürlich Freude auf als Nämbercher. Fotobeweis gibt es sobald ich das Kabel für die Kamera aus dem Koffer habe..

Samstag, 29. August 2009

Incheon International Airport, Seoul, South Korea


Local time: 2:41pm. Warten in der Lounge auf den Weiterflug nach Sydney. http://www.google.com/search?q=local+time+germany: 7:41am. Ich hab jetzt schon kein Zeitgefühl mehr. Immerhin waren die ersten 10 Stunden Flug ruhig, schlafen war auch ganz gut möglich, unangenehm ist die ganze Geschichte trotzdem. Wann werden endlich kryogenische Tiefschlagtruhen erfunden?

Dank free Wireless und Informatik Fakultäts-VPN (Ohm VPN tut ja grad nicht..) hier also auch Internet.. doof nur, das Leetnux sich weigert mit dem Hotspot zu verbinden.

Weiterflug in ungefähr 5 Stunden, nochmal 10 Stunden Tortur, nochmal 6 Stunden warten in Sydney. Vielleicht sollte ich in der Lounge hier mal Duschen und was Essen..

Donnerstag, 27. August 2009

Another pointless blog..

..about life, the universe and everything. Simply put 42.
Let's look how this one works out.