これは主観的な質問またはトピックから外れた質問と見なされる可能性があることを認識しているので、閉じるのではなく、プログラマーに移行されることを願っています。
私は主に自分自身の啓蒙のためにHaskellを学び始めており、言語を裏付ける多くのアイデアや原則が好きです。Lispで遊んだ言語理論のクラスを受講した後、関数型言語に魅了されました。Haskellの生産性について多くの良いことを聞いていたので、自分で調べてみようと思いました。これまでのところ、私はこの言語が好きですが、私がただ逃げることができない1つのことを除いて、それらの母親は関数の署名を無効にします。
私の専門的な経歴は、特にJavaで主にOOを行っています。私が働いてきた場所のほとんどは、多くの標準的な現代の教義に打ちのめされてきました。アジャイル、クリーンコード、TDDなど。このように数年間作業した後、それは間違いなく私の快適ゾーンになりました。特に、「優れた」コードは自己文書化する必要があるという考えです。私はIDEでの作業に慣れてきました。ここでは、非常にわかりやすい署名を持つ長くて冗長なメソッド名は、インテリジェントなオートコンプリートとパッケージやシンボルをナビゲートするための膨大な数の分析ツールでは問題になりません。EclipseでCtrl+Spaceを押して、JavaDocsをプルアップする代わりに、メソッドの名前と引数に関連付けられたローカルスコープの変数を調べて、メソッドが何をしているのかを推測できれば、うんちをしている豚のように幸せです。
これは明らかに、Haskellのコミュニティのベストプラクティスの一部ではありません。私はこの問題について多くの異なる意見を読みましたが、Haskellコミュニティはその簡潔さを「プロ」と見なしていることを理解しています。私はHaskellの読み方を読み、多くの決定の背後にある理論的根拠を理解していますが、それは私がそれらを好きだという意味ではありません。一文字の変数名などは私には面白くありません。私はその言語でハッキングを続けたいのであれば、それに慣れる必要があることを認めます。
しかし、関数のシグネチャを乗り越えることはできません。Learn you aHaskell[...]の関数構文に関するセクションから抜粋した次の例を見てください。
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"
| weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
これはガードとクラスの制約を説明する目的でのみ作成されたばかげた例だと思いますが、その関数のシグネチャだけを調べると、その引数のどれが重みになるのかわかりません。または高さ。Float
タイプを使用したり、代わりに使用したりDouble
しても、すぐには識別できません。
最初は、私はかわいくて賢くて見事だと思い、複数のクラス制約を持つより長い型変数名を使用してそれを偽装しようとしました。
bmiTell :: (RealFloat weight, RealFloat height) => weight -> height -> String
これはエラーを吐き出します(余談ですが、誰かが私にエラーを説明できれば、私は感謝します):
Could not deduce (height ~ weight)
from the context (RealFloat weight, RealFloat height)
bound by the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:(25,1)-(27,27)
`height' is a rigid type variable bound by
the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:25:1
`weight' is a rigid type variable bound by
the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:25:1
In the first argument of `(^)', namely `height'
In the second argument of `(/)', namely `height ^ 2'
In the first argument of `(<=)', namely `weight / height ^ 2'
それがうまくいかなかった理由を完全に理解していなかったので、グーグルを始めました。名前付きパラメーターを提案するこの小さな投稿、具体的には、を介して名前付きパラメーターをスプーフィングnewtype
することさえ見つけましたが、それは少し多いようです。
有益な関数シグネチャを作成するための許容できる方法はありませんか?「TheHaskellWay」は、単にすべてのがらくたをハドックするためのものですか?