Hoomla

“Symmetry is a complexity reducing concept […]; seek it everywhere.”

Hjälp på vägen

clock november 4, 2009 08:02 by author kullbom

På samma sätt som alla C#-programmerare idag vet att de egentligen för länge sedan borde ha gått över till F# vet Java-programmerare att de borde gått över till Scala eller ännu hellre OCaml-Java eller liknande.

Tyvärr finns fortfarande programmerare som - av olika skäl - ännu inte haft möjligheten att helt och fullt byta upp sig. Dessa stackare söker givetvis efter stöd av olika former och vi som följer frågeställningarna som dyker upp på t.ex. stackoverflow.com vet att frågan om FP-bibliotek för dessa språk är återkommande.

För de stackars C#-programmerarna finns idag följande hjälp att tillgå:

  • FpSharp - This library provides functional programming abstrations for .NET and C# including map, fold, filter functions for ordinary .NET collections, the option data type, a lazy type, a functional list type, lazy functional lists, and more.
  • Functional C# - This is a set of libraries to demonstrate functional programming aspects as implemented in C#. This is not to imply that C# is a functional language, but can implement some of the aspects of it. This project is to demonstrate some of those techniques
  • Elevate - Elevate is an easy to pick up library containing things you wish were in the BCL. Use one component or many. Contribute your own utilities. Help us make Boost for .NET.
    Elevate is developed in C#. Currently, we're focused on adding concepts from functional languages.
  • Kinet - Kinet is a library for C# that provides useful data structures and algorithms for general purpose programming. It is somewhat inspired by the Functional Java project and the Haskell programming language.
  • Functional .Net - C# 3.0 and VB 9 provide strong elements of functional programming in mainstream languages (lambda expressions, extension methods, a weak version of type inference for local variables, etc.)
    The library support for them, however, is pretty much limited to IEnumerable<T> and LINQ. This project is intended to extend it by providing additional data structures, algorithms, and extension methods.
  • Sasa - Sasa is a collection of useful C# extensions to the standard library. There are tuples, Linq extensions, full MIME e-mail parsing, a POP3 client, array combinators, compact serialization, purely functional lists, lazy types, and more.

Luca Bolognese har också (utan att mig veterligen paketera sin kod) skrivit en läsvärd artikelserien i ämnet: "A C# library to write functional code"(BackgroundTuplesRecordsType Unions och The Match operator).

På Java-sidan finns också vissa möjligheter:

  • Functional Java - Functional Java is an open source library that aims to prepare the Java programming language for the inclusion of closures. It also serves as a platform for learning functional programming concepts [...]
  • FunctionalJ - FunctionalJ is a library which makes it easy to use functional programming constructs in Java code.
  • Jambda - Jambda is an attempt to provide the Java(TM) world with tools and concepts from functional programming (FP). (Här har jag själv haft viss inblanding)
  • LambdaJ - Manipulate collections in a pseudo-functional and statically typed way.
Edit: Lade till "Sasa" till C#-listan

Bli den första att värdera denna post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Instängd

clock maj 3, 2009 13:30 by author kullbom

Under senare tids programmering i C# har en känsla av instängdhet vuxit sig starkare och starkare hos mig.Jag kommer att tänka på en av de stackars katterna från Lambdacats och tror mig uppleva något liknande. För egen del har jag inte gått så långt att jag känner mig instängd av sidoeffekter i allmänhet. Den ständiga närvaron av null och exceptions är dock minst sagt frustrerande och kan beskrivas som att man konstant befinner sig inuti en Maybe-monad och en Error-monad på en gång utan att ha någon som helst möjlighet att någonsin komma därifrån (en hemsk känsla).

Till och med grundläggande och till synes helt oskyldiga operatorer som +, - och × (för att inte tala om /) är så opålitliga att de låtsas vara fria fast de hör hemma i både en och två monader (Overflow, DivisionByZero etc.).

Även om situationen i Haskell i allmänhet är bättre har man där, t.ex., valt att ha en definition av head av den olyckliga typen [a] -> a. Den skrämmande beskrivningen lyder: “Extract the first element of a list, which must be non-empty.”.

Om man som jag under vissa tider helt har undvikit arrayer av rädsla för IndexOutOfRange skulle man kanske önskat sig en något rimligare typ eller att man helt avstått från en definition av head m.fl.

Vi kan nu antingen acceptera vår eländiga “monadiska situation” och gå medpå att allt av olika skäl kan gå sönder eller - förgäves - fortsätta låtsas som om man med hjälp av Options, Exception-unioner och liknande skall kunna slå sig ut.

Men hur och vad vi än gör så gör vi det hela tiden inifrån de eländiga monaderna. Vi måste ut!

Bli den första att värdera denna post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


En glömd monad

clock augusti 11, 2008 20:25 by author kullbom

Efter att precis ha läst om “The Marvels of Monads” av “Yet Another Language Geek” - om monader i C# - insåg jag att den är en av de mer begripliga artiklarna i ämnet och samtidigt en av de få (utanför Haskell-världen) som tar upp de monadiska lagarna.

Bli den första att värdera denna post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Tre lokala vävbidrag

clock augusti 11, 2008 16:52 by author kullbom

För att väva ihop hoomla ytterligare lite länkar jag härmed in tre dokument i olika stadier av utveckling:

Bli den första att värdera denna post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Closures och for-loopar

clock augusti 11, 2008 16:22 by author kullbom

Att följande kod resulterar i att tre sjuor skrivs till konsolen är ett lite märkligt faktum i C#.

List<Action> actions = new List<Action>();

for (int i = 4; i < 7; i++)
   actions.Add(() => { Console.WriteLine(i.ToString()); });

foreach(Action a in actions)
   a();

Att det är så beror på att C# återanvänder en och samma variabel (i) och att de closures som samlas upp i actions har kapslat in en referens till ett och samma i till skillnad från det aktuella värdet av i. Det samma gäller för övrigt foreach-loopar.

Bästa sättet att komma runt problemet är som vanligt att inte använda de primitiva loop-konstruktionerna i C# (ForEach-metoden på listor lider inte av det här problemet då lambdan alltid skapar ett nytt “scope”) men om man envisas skriver man lämpligen istället något i stil med:

List<Action> actions = new List<Action>();

for (int i = 4; i < 7; i++)
{
    int j = i;
    actions.Add(() => { Console.WriteLine(j.ToString()); });
}

foreach(Action a in actions)
   a();

Erik Meijer reder ut det hela i i sin Programming Language Beauty: Look Closure. Många intressanta länkar om man inte tycker C# är så spännande längre.

Just nu värderat 4.0 av 1 människor

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Mono, Cocoa och MacOSX

clock juli 27, 2008 18:04 by author kullbom

.Net under Mono blir sakta men säkert ett vettigt alternativ för oss som envisas med att vilja utveckla för MacOSX.

Efter att projektet ObjCSharp stått och stampat under en längre tid tog Laurent Etiemble tag i situationen och skapade Monobjc:

The Monobjc bridge provides the necessary tools to develop and run .NET applications (written in C#, VB.NET, etc.) that interact with Objective-C frameworks and libraries under Mac OS X. Existing Objective-C classes can be used in .NET code in an almost transparent manner.

(Utifrån Laurents exempel lyckades jag efter vissa justeringar av Monobjc kompilera en körbar test-applikation skriven i F#.)

Trots att Monobjc fortfarande verkar relativt okänt i mono-världen släpper sedan Julius Eckert en mindre men fullt användbar IDE för Monobjc kallad MonoMate. MonoMate är open source (C#) och koden hittar du här: http://code.google.com/p/monomate/

För den som lärt sig uppskatta .Net Reflector finns TypeRefleX som alternativ under MacOSX...

Bli den första att värdera denna post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


foreach och typsäkerhet

clock maj 26, 2008 23:55 by author kullbom

Edit: Då det ursprungliga inlägget i sak var fel ersätts det härmed med en länk till en korrigerad version.

Just nu värderat 4.0 av 1 människor

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5