関数型言語のリテラルは、空の型の関数と考えることができますか?


7

少し前に、私はスタックオーバーフローについて考えました。誰かがHaskellリテラルは何も操作しない関数と考えることができると言うのを見ました。これは私には理にかなっていますが、誰かが彼に激しく反対していることを覚えています。

私が正しく理解していれば、プリミティブ型のすべての値、または少なくともの値Boolは型コンストラクターであり、型コンストラクターは型への特殊な種類の関数です。以下のような値があるので2.87Trueまたは、'f'それらに渡されたパラメータを持っていない、それは彼らのタイプにあなたがちょうど彼らのタイプの要素または何も含まないタイプの関数と考えるかどうか、言語の意味論に影響を与えないだろうように思えますそれは常にそれらの値を返します。このようにリテラルを考えることに問題はありますか?


3
ユニットタイプ(つまり、空のタプル)の関数を意味しますか?この場合はい。
ガレ

1
@gallaisああそうです。ユニットが1つの要素を持つ依存型理論の観点から考えました。しかし、これは理にかなっています。ありがとうございます。これを答えに変える必要があります。
Anon Ymous 2017年

回答:


10

Agdaのような総合的な言語から始めましょう。次に、ガレーが述べるように、これは、「空のタイプ」によって単位タイプ、つまり0-aryタプルが正確に1つの値を持つことを意味する場合にのみ意味があります。空の型は0ケースの合計型と考えることができ、値はまったくありません。Agdaでは、Unit -> Aが同型であることを簡単に証明できますA。その意味では、それらは同じであると見なすことができますが、文字通り同じではありません。たとえば、aのケース分析はできません。また、関数として何にもUnit -> Bool適用できませんTrue : Bool

Haskellの話はかなり異なります。() -> Aそして、A意味的に非同型タイプです。具体的には、() -> ()ながら、四つの値を持つ()4つのだけ有する2 observationally別個の値はundefined\_ -> undefined\x -> x\_ -> ()。つまり()、には関数が1つしかないという意味で、実際にはユニットタイプではありません()。(一方、Agdaでは、との場合x : Unity : Unitそれらが等しいことを証明できます。つまりUnitrecord構文とは対照的に、data構文で定義すると、Unit値が1つだけであることを証明できます。さらに、Unitそして、A -> Unitすべての同型ですA。)

実際、「空」タイプのVoid定義data Voidは、この意味ではユニットタイプに近いです。Void値は1つだけですが、Void -> Voidまだ2つあります。実際、すべての関数型A -> Bには、少なくとも2つの観測的に異なる値がundefinedあり\_ -> undefinedます。したがって、Haskellには真のユニットまたはvoidタイプはありません。

これの多くは、Haskellが厳密でない言語であることが原因であり、Haskell seq(およびその同等物)の存在によって苛立たされています。たとえば、との違いはundefined\_ -> undefinedのみ確認できseqます。seqHaskellからその同等物を削除した場合Void、皮肉なことに、ユニットタイプとして機能しますが、それでも空のタイプではありません。

通常、人々がHaskellでそのようなことについて話すとき、彼らはHaskellがそれよりもよりふるまいた言語であると暗黙のうちに偽っています。つまり、彼らはボトムズが彼らの目的のために存在しない、すなわちあなたがAgdaのような総合的な言語で働いていると想定しています。コードを設計するためには、通常これで十分です。ボトムスを気にしたり期待したりすることは一般的ではありません。これらの区別は、循環プログラミングなどを行っている場合、またはプログラムの安全性の保証がこれらのプロパティに依存している場合に重要になる可能性があります。たとえば、ドメインに空の型がある場合、関数を呼び出すことはできません。


1
好奇心から、Haskellのどこかで公式に(用語ではなく)の概念を定義していますか?
Andrej Bauer

1
@AndrejBauerご存知のように、Haskellには正式なセマンティクスがないため、値の正式な定義はありません。Haskellレポートでは「value」という言葉を使用していますが、式を説明しているため、一部を除いて実際には定義していません。たとえば、エラー/非終了は値であると明示的に述べています
Derek Elkinsが

ええ、私は言語の実際の定義の欠如についてHaskellitesをからかうのが好きです。
Andrej Bauer 2017年

@AndrejBauer本当に残念です。民俗学は、Haskellの一部の断片のセマンティクスが存在することを望んでいますが、単一の統一定義はありません。おそらく、あまりにも大きくなりすぎて、妥当な努力で処理できません:ST、安全な強制eqT、GADT、タイプファミリー、非常に一般的な型クラス(矛盾?!)などは、扱いにくいように見えます。ここで投資回収の問題が発生する可能性もあります。たとえ大規模なコストで正式なセマンティクスを生成する可能性があっても(?)、それに応じて大きな影響がありますか?おそらく違います。そして2年間で新しいGHC拡張がそれを壊します... :-(
chi

1
@chi実際、一般的にKフレームワークプロジェクトはかなり興味深く見え、GHCコアの機械化された定式化を提供するアクティブなプロジェクトがあります。KフレームワークをC、Java、JavaScriptに適用する作業はかなり有望であるように思われます。Kフレームワーク(および関連するマッチングロジック)の背後にある考え方は、共通のセマンティクスから複数のツールを生成することにより、機械化セマンティクスのROIを高めることです。
Derek Elkinsが
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.