HaskellとClojureとF#で書き比べ

最近ClojureとF#が気になってしょうがないので、最近楽しませてもらってるPython練習コミュニティサイトCheckiOに掲載されている問題の一つ、words_finderHaskellClojureとF#で書き比べてみた。同じ問題の同じアルゴリズムでの解答をそれぞれの言語で解く事でコーディング感覚の違いを知ろうという趣旨。

まずはPythonでの解答 (ネタバレ注意:CheckiOは本来は自分が解答しないと他人の解答は見られない)

def checkio(text, words):
    span=[]
    for w in words.split():
        for i in range(len(text)):
            if text[i:i+len(w)].lower()==w.lower():
                span.append((i,len(w)))
    def check(i):
        return set(a for a,b in span if i>=a and i<a+b)
    ans=''
    for i in range(len(text)):
        c1,c2,c3=[check(j) for j in range(i-1,i+2)]
        if len(c2)>0 and len(c1&c2)==0: ans+='<span>'
        ans+=text[i]
        if len(c2)>0 and len(c2&c3)==0: ans+='</span>'
    return ans

Pythonはデフォルト言語という位置づけがしっくり来るくらい普通のコードが書ける。

  • Haskell
    • (個人的にHaskellは趣味でよく触っているので少し慣れている)
    • Listモナドと内包表現がやはり強力
  • Clojure
    • Javaライブラリとの接続はかなりスムーズに書けてよい
    • Clojureリテラルが強力なのが便利だと思った
    • 括弧が増えてもインデントの位置で分かるので大丈夫そう
    • マクロのおかげでいろいろとすっきりする
    • Haskellより長くなる気がする(慣れてないせい?)
  • F#
    • .NETライブラリとの接続はClojureより複雑な感じがした
    • letが多くなりがちだが、パイプライン演算子でしのぐ感じ
    • リテラル記法が手薄く標準ライブラリで明示的に書く感じ
    • printfの"%A"が便利
    • Clojure, Haskellより長くなる気がする(慣れてないせい?)

CheckiOの問題は練習問題として良いので関数型言語で解く練習をつづけるつもり。(GitHubレポジトリ作った.)