Haskell / Pythonの学習がプログラマに害を与える方法

翻訳者から:



C ++ / C#で平凡なコードを書くとき、「脳のb迷」の次の状況が私をこの翻訳に追い込みました。 私は彼だけがいのを見ただけで、それは私の問題であり、コードや言語の問題ではないことを受け入れなければなりませんでした。 私はこれが私と一緒ではなかった時間を思い出しました-同時に、私はそれについてよく書いている間、著者が私と同じように苦しんだこの古い記事を思い出しました。



PythonとHaskellを学ぶことは 、他の言語のプログラマーとして私を向上させないことがわかりました(それについて時々書かれていることと矛盾します) 。 特に、Haskell-命令型言語とはまったく異なる-理論的には、言語をまったく使用しなくても役立つプログラミングの啓蒙を与えると考えられていました。 私の現在の経験はこれに完全には一致していません。その理由は次のとおりです。



  1. やる気。



    私はPythonで、時にはHaskellでさえ、ある程度は考えていることに気付きました-Haskellをかなり使用しているという事実にもかかわらず。 私は常にこれらの言語のイディオムを使用したいという欲求を発見し、これらの言語を使用した場合にコードをどれだけ短縮できるかを計算します(互いに非常に異なっていますが、両方とも職場で使用している言語よりもはるかに強力です- C#) 。 ほとんどの場合、この計算は、これらの言語のいずれかを使用すると、コードベースの一部でコードのサイズを2〜5倍、多くの場合10〜20倍削減できることを示しています。



    さらに、Haskellでの私の経験から、命令型コードのどこにでも潜在的なバグが見られました。 ステートフルプログラミングと副作用から生じる問題についてはすでによく知っていました。私自身もこのようなバグに数多く遭遇し、デバッグに数時間費やしています。 しかし、他に選択肢はありませんでした。 同じ問題を解決する他の方法があることを知った今、自分のコードに満足することは困難です。 私は、他の人が陥りそうなtrapを書いていることを常に心配しています。



    また、PythonやHaskellと比較して、C#コードは非常に見苦しいと感じています。 視覚的レベルでは、ブラケットの必須使用(まあ、常に必須ではありませんが、通常、コーディング標準はこれを正当に奨励しません)により、コードは非常にノイズが多く、まばらになり、ライブラリの厳密さと冗長性と組み合わせると、ページ全体がC# 'a、commonそれは何もしません。 そして、数学レベルで美しさについて話すと、C#コードはHaskellコードのエレガントな尖塔と比較して、不器用な粘土小屋にすぎません。



    これらすべての要因がすべて私をうつ病にし、士気を低下させます。 私の頭の中にあるHaskellやPythonから、さらに低いレベルの言語に翻訳する人間のコンパイラのように感じます。
  2. , .



    C# , . , , — . Foo



    , Description()



    , . description', .



    , Python, :

    "\n".join(foo.description() for foo in mylist if foo.description() != "")



    , Haskell:

    concat $ List.intersperse "\n" $ filter (/= "") $ map description mylist



    , Haskell:

    map description >>> delete "" >>> List.intersperse "\n" >>> concat



    generics- C# 2.0, , , :

    string.Join("\n", mylist.ConvertAll<string>(

        delegate(Foo foo)

        {

            return foo.Description();

        }).FindAll(

        delegate(string x)

        {

            return x != "";

        }).ToArray());




    , C#- — C# , . , - , «» ( - ), , .



    C#-, . , ( ) . , :

    string retval = "";

    foreach (Foo foo in mylist)

    {

        string desc = foo.description();

        if (desc != "")

        {

            if (retval != "")

                retval += "\n";

            retval += desc;

        }

    }




    - .



    : . , , ( , , ConvertAll ConvertAll



    ).



    , -- . -- , -- , ? , - , .






    — , . Java, , . C# , C# 2.0 , , .NET , — .



    , ( , ..) , . , - . ASP.NET — . , Control



    . , . (, ).



    , , instance-, , , . '' , . (, , ) , — OOP. , , , . .
  3. — , , . C#, Haskell Python, , , — .



    : , . .



All Articles