RSS

Category Archives: Haskell

One year with “Haskell Programming from First Principles”


My relationship with the Haskell programming language, my efforts to learn it had its ups and downs throughout the years. According to my memory and the archives of my blog, my first attempts had been around 2005 – 2006, more than 12 years ago. Back then, apart from a few books written by university professors, and some Wiki-based books, I couldn’t find much high quality material for beginners. Therefore, my efforts didn’t last very long. A few years later, I heard the news about a new book, “Real World Haskell” being written. I was excited once again, I even made a few comments here and there as the book was being written. Unfortunately, life happened, and I couldn’t spend much time on that nice book, too. Fast forward to the end of 2015, and I was working at a company in Ghent, Belgium where there were some Haskell experts, trying out things in an industrial storage system development environment. The teams that I was part of had nothing to do with Haskell though, my daily job was almost always about Python, Bash, ActionScript, Java, and some Scala. Nevertheless, being in such an environment rekindled my curiosity, and I decided to look around to see if there was some new Haskell books targeted at people who didn’t use this language before. Luckily, I’ve heard about the book “Haskell Programming from First Principles“, and I decided to give it a try. Therefore I bought the book, and started to read and study it in the beginning of 2016. Since Haskell was not at all used in my daily job, I could study the book only in my spare time, therefore it took me about 1 year to finish the book, doing most of the exercises. Read the rest of this entry »

Advertisements
 
 

Tags:

Lisp ve Özgürlük – Şafak Reloaded


Lisp ve Özgürlük üstüne sevgili tonguc biraderim “Şafak kaç? (Haskell version)” şeklinde bir çıkış yapınca basit Lisp koduna müdahale etmek farz oldu ve bir şeyler daha karaladım.

Common Lisp’in format fonksiyonunu biraz eğip bükmek remaining-safak kodunun belli bir noktaya gelmesini sağladı. Bunun ardından kodu comp.lang.lisp canavarlarına yollayıp “bunu nasıl daha sade ve güzel yazabiliriz yeniden?” diye sorunca Pascal J. Bourguignon‘dan her zamanki gibi şık ve güzel soyutlamaları içeren bir cevap geldi, üstad bununla yetinmemiş bir de Maya takvimine göre şafak hesaplayan kodu da eklemiş:


CL-USER> (format-decomposed-value (time-interval-to-components (remaining-safak))
 *time-bases-names*)
"1 month, 5 days, 5 hours, 4 minutes, 40 seconds. "

CL-USER> (define-base-decomposer decode-mayan-date '(60 60 24 20 18 20 20))
DECODE-MAYAN-DATE

CL-USER> (format-decomposed-value (decode-mayan-date (get-universal-time))
                         '("second""minute""hour""K'in""Winal""Tun""K'atun""B'ak'tun"))
"5 K'atuns, 10 Tuns, 3 Winals, 9 K'ins, 15 hours, 58 minutes, 11 seconds. "

Tabii bu arada Volkan Yazıcı’nın da çözümünü gözardı etmemek lazım 😉

Bunlar olup biterken Türk ordusunda Common Lisp ve Haskell programcıları bulunmasından ötürü şaşırıp gaza gelen bir reddit okuru da tonguc’un Haskell çözümü üzerine “point-free” ve “do notation” yaklaşımlarını kıyaslayan iki Haskell çeşitlemesi gönderdi bu tema üstüne.

Not: Bu blog girdisi şu anda askerliğini Çorum askerlik dairesinde yapan ve Amasya’daki acemiliğimizde yan ranzamda yatarken bir akşam vakti bana Paul Graham’ın “Hackers and Painter” kitabının Türkçe çevirisini gösteren, Lisp ile ilgilendiğini belirten programcı dostum Hayri KILIÇ’a ithaf olunur. Arz ederim! 🙂

 

Real World Haskell: Taslak eleştiri süreci başladı


Tamamlandığında O’Reilly tarafından yayınlanacak olan Real World Haskell kitabının taslak bölümlerinin eleştiri süreci başladı.

Vakti zamanında kendilerine başvuruda bulunanları bir e-posta listesi aracılığı ile bilgilendiren yazarlar, bu sürece katılan kişilere kitabın taslak halini parola korumalı bir web ortamında açmış durumdalar ve birkaç gün içinde gelen yüzlerce eleştiri de bu kitabın insanlarda yarattığı heyecanın bir göstergesi.

İşin güzel yanı kitabın Internet ortamındaki taslak bölümlerinin eleştirilerinin yine aynı ortamda, paragflar altında derli toplu olarak yapılabiliyor olması. Böylece kitabı okurken bir paragrafın altındaki küçük bir etiket kaç eleştiri veya yorum geldiğini gösteriyor, buna tıklayınca da yukarıda yazılanla ilgili eleştirilerin hepsini okumak ve yeni yorum / eleştiri yazmak mümkün oluyor. Bu da e-posta trafiğini çok azaltıp tek bir yerden ilgili tüm bilgilere entegre şekilde erişmeyi kolaylaştırıyor. Bir başka faydalı özellik de RSS sayesinde kitap bölümlerinde ve gelen yorumlarda güncelleme oldukça bunları kolayca öğrenme imkanı.

Yaklaşık 3 sene önce yoğun şekilde yorumlama ve eleştirme sürecine katıldığım Practical Common Lisp isimli harika kitap örneğinde olduğu gibi Real World Haskell kitabının eleştiri / yorum süreci de bana pek çok şey öğretecek gibi görünüyor. Böylece belki de bir programlama dilini öğrenmek için yepyeni bir paradigmadan da bahsetmek mümkün: O dille ilgili yazılmakta olan bir kitabın ortaya çıkış sürecine küçük de olsa katkıda bulunmak 😉

 

Google Summer of Code 2007 – Common Lisp ve Haskell


Google SoC 2007 için projeler belirlendi, birkaç gün içinde de projeler için programcıların kabulü tamamlanacak. Hala vakit var.

Common Lisp ile yaz boyunca kodlama yapmak ve birkaç bin $ kazanmak isteyen üniversite öğrencileri LispNYC SoC 2007 sayfasına, benzer şeyi Haskell ile yapmak isteyenler ise Haskell SoC 2007 sayfasına bakabilir.

 

Gizli silahlar ve fonksiyonel programlama


Bugün irc.freenode.net’te #haskell kanalındaki yazılım geliştiricilerden biri başvurduğu bir şirketi ve birkaç saatlik iş görüşmesini anlatıyordu. Hangi şirket olduğunu sorduğumda Aetion Technologies olduğunu, şirketin finans, üretim ve savunma alanlarına yönelik olarak stratejik ürünler geliştirdiğini belirtti. Hakkımızda kısmında ise şöyle yazıyordu:

Over coming months we are recruiting intelligent programmers who can proficiently apply computer science. In our work we often learn and apply technical skills, including functional programming, to master new challenges. A background in mathematics, science or engineering is an advantage.

Web sayfalarının hemen hiçbir yerinde neleri kullandığını söylemeyen şirketin web sistesinde hakkımızda bölümündeki küçük bir not ve linkten gidildiğinde ise şu tür açıklamalar göze çarpıyordu:

Much of our development is done in Haskell using the Glasgow Haskell Compiler under Debian GNU/Linux on AMD-based machines. We use opensource tools such as QuickCheck, Hunit and darcs to manage code.

Aklıma Common Lisp, Haskell gibi popüler olmayan dillerle karşılaştıklarında “ama bu diller geliştirilmiş ve milyonlarca insanın kullandığı ürünler nerede, madem o kadar iyiler Oracle ve SAP niye bunları kullanmıyor ki, hem Java ve C# kadar neden yaygın değiller madem?” şeklinde soru soranlar ve bunlara verilen klasik cevaplar geldi.

Aklıma gelen bir başka şey ise iş ilanlarında programcının 30 yaşından gün almamış olmasını, askerlikle ilişkisinin bulunmamasını ve aynı anda HTML, JavaScript, Java, CGI, .NET, C#, Perl, CVS, Subversion, Photoshop, Office ve Assembly bilmesini isteyen şirketler geldi, bu blog girdisine konu olan şirketin adam arama şekline göz attım:

We do not have time to study all applicants carefully. Therefore, especially for programming positions, we strongly encourage you to draw our attention to yourself by submitting some Haskell code that demonstrates your understanding of recursion and monads. You may submit code that you have written in some previous work, or devise a new idea of your own. Examples of the sort of code that uses monads sufficiently include: Longest.hs, for finding which file has the most lines; Stack.hs and StackM.hs, a stack monad that implements a FILO.

Bu şekilde çalışan arama yöntemi geliştiren şirkete can kurban mı desek, ne desek bilmem…

Tabii bu birkaç alıntı ve söz konusu şirketin web sitesi, ucu açık, kesin çözümü çok iyi bilinmeyen, deneysel programlama teknikleri gerektiren ve karmaşık algoritmaların geliştirileceği, hızlı çözüm sunulması gereken projelerde çok yaygın olmayan ama güçlü dillerin kullanıldığına dair bir örnek olarak okunabilir.

 
 

Hamming sayıları ve tembelliğin erdemleri: C# vs. Haskell


Bilgisayar bilimleri ve programlama ile ilgilenip de Hamming ismini duymamış olmak çok düşük bir olasılıktır herhalde. Bu tanıdık isim ve ilgilendiğim programlama dilleri bir araya gelince ister istemez algıda seçicilik oluşuyor. Bu seçicilik sonucunda önce “The Virtues of Laziness” makalesi ile karşılaştım ve yazarın C# kullanarak tembel fonksiyonel dillere içkin bir özelliği C# ile elde edebilmek için ne tür taklalar attığına baktım ve bunun uygulaması olarak Hamming sayılarının hesaplanması problemini ele aldığını fark ettim.

Kullandığım diller arasında C# da olduğu için bu tekniğin işime yarayacağını düşünüp not ettim ve ardından yorumları okumaya koyuldum ve karşıma Hamming sayılarının Haskell ile nasıl hesaplanabileceği çıktı:

hamming = 1 : map (*2) hamming # map (*3) hamming # map (*5) hamming
    where xxs@(x:xs) # yys@(y:ys)
              | x==y = x : xs#ys
              | x<y = x : xs#yys
              | x>y  = y : xxs#ys

Hemen GNU Emacs’ı ateşleyip kodu denedim ve sonsuza uzanan listelerin keyfini çıkardım:

*Main> take 4 hamming
[1,2,3,4]
*Main> take 10 hamming
[1,2,3,4,5,6,8,9,10,12]
*Main> take 30 hamming
[1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,64,72,75,80]

Haskell öğrenmek için bir sebep daha diye bunu bir kenara kaydettim. Dikkatimi çeken bir başka şey ise son birkaç yıldır gözlemlediğim “popüler dillerin egzantrik kabul edilen dillerin özelliklerine yakınsaması” olgusuna dair bir örnek daha ortaya çıkmış olması.

Daha detaylı bir tartışma, C++ ve Haskell (ve başka pek çok dil) kıyaslaması için LtU’daki birkaç yüz yorumluk Expressivity of “idiomatic C++” yazısına bakılabilir.

 

Haskell ile küçük adımlar


Uzun zamandır merak ettiğim fonksiyonel programlama dillerinden biri olan Haskell ile nihayet biraz ilgilenebilme fırsatı bulabildim. Evdeki Debian GNU/Linux sistemime gerekli Haskell derleyicisini, kütüphanelerini ve Emacs için haskell-mode’u kurduktan sonra ufaktan Haskell wikibook‘tan çalışmaya başladım ve Beginner’s Track olarak tarif edilen izleğin Practical Monads isimli son bölümüne kadar geldim. Tabii geleneğe uygun olarak monadların derinliklerine girmeden önce püskürtülmeyi ve tokatlanmayı peşinen kabul ettim 😉 Yine de son kısımdaki çok basit, pratik Lisp “parser” örneği Haskell’in gücüne dair bir şeyler anlatıyor gibi. Bunun üzerine bir kat daha boya çekmek için YAHT‘a başladım ve onun da Type basics bölümüne kadar gelebildim. Bundaki egzersizleri yapıp sonra üstüne son bir kat cilayı A Gentle Introduction To Haskell ile çekip sonra Haskell ile belki bir şeyler yapmaya girişebilirim. (Ya da şimdiye kadar gördüğüm en çıkıntı “tutorial”lardan biri olan Write Yourself a Scheme in 48 Hours ile biraz antrenman yaparım.)

Şimdiye dek önceki Scheme ve Common Lisp deneyimimin Haskell çalışmada bana bazı açılardan faydası oldu, en azından fonksiyonel programlamanın bazı temel nosyonlarına yabancı olmamak (“değişken”lerin değişmemesi gibi, üst dereceden fonksiyonlar, map türü yapılar, vs.) yahut verilen “parser” örneklerinde yabancılık çekmemek gibi. Diğer yandan önceki Prolog bilgim de Haskell’deki liste notasyonunu anlamamda kolaylık sağladı.

Tüm bunlardan sonra, şimdiye dek geldiğim noktaya bakarak, defmacro’nun The Ducati Of Programming Languages yazısında ne kast ettiğini ve neden o tür bir kıyaslama yaptığını daha iyi anlıyorum. Bu arada bakalım bir yandan Common Lisp ile “window manager” programlama dünyasına damardan giriş yapan opheus‘un Haskell deneyimleri nasıl ilerleyecek 😉