他の誰も試みようとしないなら、私はこれらの質問に答えるために別の(もう少し慎重に調査した)突き刺しをします.
tl;dr
質問 1: これがサイコロの出方です。それは状況に応じた選択であり、立ち往生しました。
質問 2: はい (ちょっと)。確かに、いくつかの異なる政党がこの問題について考えていました。
関連性があり興味深いと思われるリンクと引用に基づいて、各回答の非常に長い説明を読んでください。
すっきりとしたレイアウトベースのアプローチではなく、C に似たレコード構文が採用されたのはなぜですか?
Microsoft の研究者は、Haskell の歴史に関する論文を書きました。セクション 5.6 では、レコードについて説明します。洞察に満ちた最初の小さな部分を引用します。
Haskell の初期のバージョンでの最も明白な省略の 1 つは、名前付きフィールドを提供するレコードがないことでした。記録は実際に非常に役立つのに、なぜ省略されたのですか?
次に、Microsofties は自分の質問に答えます
最も強い理由は、明確な「正しい」設計がなかったことにあると思われます。
詳細については論文を自分で読むことができますが、「データ構造内の名前付きフィールドに対するプレッシャー」のために、Haskell は最終的にレコード構文を採用したと述べています。
Haskell 1.3 の設計が進行中の 1993 年までには、データ構造の名前付きフィールドに対するユーザーの圧力が強かったため、委員会は最終的に最小限の設計を採用しました...
なぜそれがなぜなのかとあなたは尋ねますか?私の理解では、もし初期の Haskeller が思い通りになれば、そもそもレコード構文はなかったかもしれません。このアイデアは明らかに、すでに C のような構文に慣れていて、「Haskell のやり方」を行うよりも、C のようなものを Haskell に組み込むことに興味を持っていた人々によって Haskell に押し込まれました。(はい、これは非常に主観的な解釈であることは承知しています。完全に間違っている可能性がありますが、より良い答えがない場合、これが私が引き出すことができる最良の結論です。)
名前空間の問題を解決するためにパイプラインに何かありますか?
まず第一に、誰もが問題だと感じているわけではありません。数週間前、Racket愛好家が私 (および他の人) に、「___ という名前の関数は何をするのか?」の分析を複雑にするため、同じ名前で異なる関数を持つことは悪い考えだと説明しました。実際、それは 1 つの機能ではなく、多数の機能です。型推論が複雑になるため、このアイデアは Haskell にとって非常に厄介なものになる可能性があります。
少し関係がありましたが、Microsofties は Haskell の型クラスについて興味深いことを言っています。
Wadler と Blott がこの重要なアイデアを、言語設計がまだ流動的な時期にたまたま生み出したのは、幸運な偶然の一致でした。
Haskell がかつて若かったことを忘れないでください。一部の決定は、単に行われたという理由だけで行われました。
とにかく、この「問題」に対処できる興味深い方法がいくつかあります。
Type Directed Name Resolution、Haskell への提案された修正 (上記のコメントで言及)。そのページを読んで、言語の多くの領域に触れていることを確認してください. 全体として、それは悪い考えではありません。物とぶつからないように工夫が凝らされています。ただし、現在 (より) 成熟した Haskell 言語に組み込むには、さらに多くの注意が必要です。
Microsoft の別の論文OO Haskellでは、「アドホック オーバーロード」をサポートするための Haskell 言語の拡張を具体的に提案しています。かなり複雑なので、セクション 4 を自分で確認する必要があります。その要点は、「Has」型を自動的に (?) 推論し、「改善」と呼ばれる型チェックに追加のステップを追加することです。
クラスの制約が与えられたHas_m (Int -> C -> r)
場合、この制約に一致する m のインスタンスは 1 つだけです...選択肢は 1 つだけなので、ここでそれを作成する必要があり、それが に修正r
されますInt
。したがって、期待される型を取得しますf
:
...[this] は単に設計上の選択であり、クラスが閉じf :: C -> Int -> IO Int
ているという考えに基づいています。Has_m
一貫性のない引用をお詫びします。それが少しでも役に立てば、素晴らしいことです。それ以外の場合は、論文を読んでください。これは複雑な (しかし説得力のある) アイデアです。
Chris Done はテンプレート Haskell を使用して、Haskell でのダックタイピングを提供しています。彼のサイトからのいくつかのインタラクティブなセッションのサンプル:
λ> flap ^. donald
*Flap flap flap*
λ> flap ^. chris
I'm flapping my arms!
fly :: (Has Flap duck) => duck -> IO ()
fly duck = do go; go; go where go = flap ^. duck
λ> fly donald
*Flap flap flap*
*Flap flap flap*
*Flap flap flap*
これには定型文/珍しい構文が少し必要であり、個人的には型クラスに固執することを好みます。しかし、この分野で彼の現実的な作品を自由に公開してくれた Chris Done に敬意を表します。