他の潜在的な貢献者への注意: 抽象的な表記法や数学的な表記法を使用して主張を主張することを躊躇しないでください。あなたの答えが不明な場合は、説明を求めますが、それ以外の場合は、快適な方法で自由に表現してください.
明確にするために:私は「安全な」を探しているわけではなく、特に例外的に意味のあるhead
選択でもありません。head
質問の本質は、コンテキストを提供するのに役立つhead
との議論に続きます。head'
私は数か月前から Haskell をハッキングしてきました (Haskell が私のメイン言語になるまで) が、より高度な概念や言語の哲学の詳細について十分な情報を得ていないことは確かです (ただし、私は学びたいと思っています)。私の質問は、哲学の 1 つであるため、あまり技術的なものではありません (そうであり、私がそれに気付いていない場合を除きます)。
この例では、 について話していhead
ます。
ご存知かと思いますが、
Prelude> head []
*** Exception: Prelude.head: empty list
これは から続きますhead :: [a] -> a
。けっこうだ。明らかに、(手を振って) no 型の要素を返すことはできません。しかし同時に、定義するのは簡単です (自明ではないにしても)。
head' :: [a] -> Maybe a
head' [] = Nothing
head' (x:xs) = Just x
これについては、特定のステートメントのコメント セクションで少し議論されているのを見ました。特に、あるアレックス・スタングルは次のように述べています。
「すべてを「安全」にせず、前提条件に違反した場合に例外をスローする正当な理由があります。」
私は必ずしもこの主張に疑問を抱くわけではありませんが、これらの「正当な理由」が何であるかについては興味があります.
さらに、ポール・ジョンソンは次のように述べています。
たとえば、「safeHead :: [a] -> Maybe a」を定義できますが、空のリストを処理したり、それが起こり得ないことを証明したりする代わりに、「Nothing」を処理するか、それが起こり得ないことを証明する必要があります.'
そのコメントから私が読んだトーンは、これが難易度/複雑さ/何かの顕著な増加であることを示唆していますが、彼がそこに何を出しているのか理解できません.
あるスティーブン・プルジナは、(2011年も同様に)次のように述べています。
「たとえば、「head」がクラッシュプルーフにならないのには、もっと深い理由があります。ポリモーフィックでありながら空のリストを処理するには、「head」は常に、特定の空のリストに存在しない型の変数を返さなければなりません。 Haskell がそれを行うことができれば Delphic...".
空のリストの処理を許可すると、ポリモーフィズムが失われますか? もしそうなら、どのように、そしてなぜですか?これを明らかにする特定のケースはありますか?このセクションは、@Russell O'Connor によって十分に回答されています。もちろん、それ以上の考えは大歓迎です。
明確さと提案が示すように、これを編集します。あなたが提供できる考え、論文などは、非常に高く評価されます。